Если я правильно это понимаю, copy принуждает установщика создавать копию переданного объекта. Однако, если я использую его вместе с readonly, сеттер не будет. Так верно ли мое предположение, что объединение @property (copy, readonly) не имеет никакого смысла или я что-то не хватает?
Копия @property в сочетании с readonly имеет смысл?
Ответ 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.
Примечание: я еще не проверял это.
Я проверил его сейчас, и мое ожидание неверно. Я думаю, что буду считать это ошибкой.