Как лучше всего использовать свойства Obj-C 2.0 с изменяемыми объектами, такими как NSMutableArray?

StackOverflow https://stackoverflow.com/questions/816720

Вопрос

У меня есть класс Obj-C 2.0, у которого есть свойство NSmutableArray.Если я использую следующий код, то синтезированный сеттер даст мне неизменяемую копию, а не изменяемую:

@property (readwrite, copy) NSMutableArray *myArray;

Есть ли причина, по которой Apple не реализовала следующий синтаксис?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

Поскольку у нас нет mutablecopy, как лучше всего справиться с этой (казалось бы, распространенной) ситуацией?Должен ли я просто написать свой собственный установщик, который выполняет -mutableCopy?

Это было полезно?

Решение

Как уже было сказано, правильный способ сделать это - не сделать изменяемый массив свойством. Есть отличное объяснение того, что вы должны реализовать, чтобы быть совместимым с KVC здесь .

Другие советы

Некоторое время назад я столкнулся с той же проблемой и обнаружил Apple_ref / doc / uid / TP30001163-CH17-SW17 "rel =" noreferrer "> документ в Apple Developer Connection , рекомендующий предоставить собственную реализацию программы установки. Пример кода из связанного документа:

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}

Распространять NSMutableArray в Какао не принято. Стандартная практика Какао должна была бы реализовать совместимое кодирование значения ключа методы для индексированного свойства to-many. Это имеет два преимущества:

<Ол>
  • Наблюдение значения ключа работает должным образом (есть несколько случаев, когда наблюдение NSMutableArray приводит к поведению «не то, что вы хотите»)
  • Реализация вашей структуры данных скрыта, поскольку вы предоставляете методы мутирования (например, - [MyObject insertObjectInMyProperty: (id) newObject atIndex: (NSUInteger) i] , а не сама структура данных.
  • Имейте в виду, что передача изменяемого массива на самом деле не является обычной практикой в ​​Cocoa.Вы можете использовать частный изменяемый массив в качестве внутреннего хранилища, но создавать методы, используя простые объекты NSArray, для добавления или извлечения объектов из него.Возможно, поэтому нет объявления свойства mutablecopy.

    Вам придется написать свой собственный сеттер.

    Правильный способ хранения NSMutableArray - с помощью свойства retain:

    @property (nonatomic, retain) NSMutableArray *myArray;
    

    Вам не нужно писать собственный установщик или использовать копию. Свойство copy следует использовать с NSArray, который действительно нужно скопировать, когда свойство захвачено в другом объекте. Например, если вы присваиваете объект NSMutableArray свойству типа NSArray со свойством copy, тогда вы захотите сделать копию изменяемого массива для " capture " это как неизменное свойство с этого момента.

    И у Марка правильный подход, обычно нельзя сделать NSMutableArray частью открытого API ваших объектов. Если у вас есть публичное свойство, это может быть NSArray со свойством copy.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top