Я заметил, что некоторые примеры Apple включают обоих a retain
и readonly
модификатор на свойствах. Какой смысл включения retain
если никакой метод set не сгенерирован, когда мы используем readonly
модификатор?
Пример: @property (retain, readonly) NSString *title;
от образца AnimatedTableView.
Вы можете включить второе, частное объявление чтения и записи в расширение класса. Схема управления памятью для всех ссылок должна соответствовать IIRC, поэтому вы получите глупость вроде «только для чтения, сохранить».
Или, более конкретно, (readonly, retain) позволяет использовать такой шаблон:
Foo.h:
@interface StuffHolder:NSObject
@property(readonly, retain) MyStuff *stuff;
@end
Foo.m:
@interface StuffHolder()
@property(readwrite, retain) MyStuff *stuff;
@end
@implementation StuffHolder
@synthesize stuff;
@end
В итоге получается свойство, которое публично readonly, но при этом является readwrite внутри реализации, и для которого сеттер и геттер синтезируются компилятором автоматически.
Предупреждение может быть выдано в случае отсутствия (readwrite, retain) переопределения в расширении класса - что-то сродни утверждению без эффекта
- но это скорее запутает, чем поможет. Кроме того, существует целый ряд различных крайних случаев в комбинациях, которые в равной степени заслуживают предупреждения, но не указывают на реальную проблему. Было принято решение в основном принимать различные шаблоны без претензий ради простоты (поскольку они не являются проблемами корректности).