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

Копия @property в сочетании с readonly имеет смысл?

Если я правильно это понимаю, copy принуждает установщика создавать копию переданного объекта. Однако, если я использую его вместе с readonly, сеттер не будет. Так верно ли мое предположение, что объединение @property (copy, readonly) не имеет никакого смысла или я что-то не хватает?

4b9b3361

Ответ 1

Это имеет смысл. Например, если вы хотите получить доступ к установщику свойств только в своей реализации:

@interface MyClass : NSObject
@property (nonatomic, copy, readonly) NSData *data;

- (id)initWithData:(NSData *)data;

@end

и в продолжении класса в файле .m:

@interface MyClass ()
@property (nonatomic, copy, readwrite) NSData *data;
@end

Обратите внимание, что объявление copy, readonly в общедоступном заголовке требуется в этом случае!

Ответ 2

В соответствии с документацией Apple (которую я здесь связал для вас):

copy
Указывает, что для назначения должна использоваться копия объекта.

Предыдущее значение отправлено a release.

Копия создается путем вызова метода copy. Этот атрибут действителен только для типов объектов, которые должны реализовывать протокол NSCopying.

Итак, вы правы... readonly создает метод getter и copy будет эффективно проигнорирован, так как нет метода setter, который выполняет назначение.

Ответ 3

Вы правы, нет смысла иметь оба.

Ответ 4

Я думаю, если бы я увидел такое свойство, то при чтении я ожидал получить отдельный возвращенный объект для ivar, если только возвращенный объект не был объявлен неизменным.

Если у меня

@property (readonly, copy) NSMutableArray* foo;

и я делаю это:

NSMutableArray* myFoo = [theObject foo];
[myFoo addObject: @"string"];
NSMutableArray* myOtherFoo = [theObject foo];

Я бы ожидал, что myOtherFoo не будет иметь в нем дополнительную строку, которая имеет myFoo.

Примечание: я еще не проверял это.

Я проверил его сейчас, и мое ожидание неверно. Я думаю, что буду считать это ошибкой.