Ответ 1
Как уже было сказано, правильный способ сделать это - не сделать свойство mutable array. Там большое объяснение того, что вы должны реализовать, чтобы быть совместимым с KVC здесь.
У меня есть класс Obj-C 2.0, который имеет свойство NSMutableArray. Если я использую следующий код, то синтезированный сеттер даст мне неизменяемую копию, а не изменчивую:
@property (readwrite, copy) NSMutableArray *myArray;
Есть ли причина, по которой Apple не выполнила следующий синтаксис?
@property (readwrite, mutablecopy) NSMutableArray *myArray;
Так как у нас нет mutablecopy
, что лучший способ справиться с этой (казалось бы, общей) ситуацией? Должен ли я просто написать свой собственный сеттер, который делает -mutableCopy?
Как уже было сказано, правильный способ сделать это - не сделать свойство mutable array. Там большое объяснение того, что вы должны реализовать, чтобы быть совместимым с KVC здесь.
Я столкнулся с той же проблемой некоторое время назад и нашел документ в приложении 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
в Cocoa. Стандартной практикой Cocoa было бы реализовать совместимость с ключевыми значениями методов для свойства индексированного числа. Это имеет два преимущества:
-[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i]
, а не сама структура данных.Имейте в виду, что передача вокруг изменяемого массива на самом деле не является обычной практикой в Cocoa. Вы можете использовать закрытый изменяемый массив как внутреннее хранилище, но создавать методы с использованием простых объектов NSArray для добавления или получения объектов из него. Возможно, поэтому не существует объявления свойства mutablecopy.
Вам нужно будет написать свой собственный сеттер.
Правильный способ привязки к NSMutableArray имеет свойство сохранения:
@property (nonatomic, retain) NSMutableArray *myArray;
Вам не нужно писать свой собственный сеттер или использовать копию. Свойство copy следует использовать с NSArray, который действительно нужно скопировать, когда свойство будет захвачено в другой объект. Например, если вы присваиваете объекту NSMutableArray свойство, которое имеет тип NSArray с свойством copy, то вы хотите сделать копию изменчивого массива, чтобы "захватить" его как неизменяемое свойство с этой точки вперед.
И у Марка есть правильный подход, обычно не следует, что NSMutableArray является частью публичного API ваших объектов. Если у вас есть общедоступное свойство, это может быть NSArray с свойством copy.