Если я правильно это понимаю, 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
.
Примечание: я еще не проверял это.
Я проверил его сейчас, и мое ожидание неверно. Я думаю, что буду считать это ошибкой.