Подтвердить что ты не робот

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

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

@property (readwrite, copy) NSMutableArray *myArray;

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

@property (readwrite, mutablecopy) NSMutableArray *myArray;

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

4b9b3361

Ответ 1

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

Ответ 2

Я столкнулся с той же проблемой некоторое время назад и нашел документ в приложении 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];
    }
}

Ответ 3

Нечасто распространяться NSMutableArray в Cocoa. Стандартной практикой Cocoa было бы реализовать совместимость с ключевыми значениями методов для свойства индексированного числа. Это имеет два преимущества:

  • Наблюдение за ключевыми значениями работает как и ожидалось (есть несколько случаев, когда наблюдение NSMutableArray приводит к поведению, которое вам не нужно)
  • Реализация вашей структуры данных скрыта, потому что вы обнаруживаете мутирующие методы (например, -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i], а не сама структура данных.

Ответ 4

Имейте в виду, что передача вокруг изменяемого массива на самом деле не является обычной практикой в ​​ Cocoa. Вы можете использовать закрытый изменяемый массив как внутреннее хранилище, но создавать методы с использованием простых объектов NSArray для добавления или получения объектов из него. Возможно, поэтому не существует объявления свойства mutablecopy.

Ответ 5

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

Ответ 6

Правильный способ привязки к NSMutableArray имеет свойство сохранения:

@property (nonatomic, retain) NSMutableArray *myArray;

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

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