Почему объявленное свойство использует и сохраняется, и только для чтения?
Я заметил, что некоторые из примеров Apple включают как retain
а также readonly
модификатор по свойствам. Какой смысл включать retain
если никакой сеттер не генерируется, когда мы используем readonly
модификатор?
Пример: @property (retain, readonly) NSString *title;
из образца AnimatedTableView.
2 ответа
Вы можете включить второе частное объявление readwrite в расширение класса. Схема управления памятью для всех ссылок должна соответствовать 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
Конечный результат - это свойство, доступное только для чтения, в то время как выполняется перезапись в реализации и для которого компилятор автоматически синтезирует и сеттер, и геттер.
Предупреждение может быть сгенерировано в случае переопределения no (readwrite, retain) в расширении класса - что-то похожее на statement without an effect
- но это было бы более запутанным, чем полезным. Существует также целый ряд различных крайних случаев в комбинациях, которые в равной степени заслуживают предупреждения, но на самом деле не указывают на реальную проблему. Было принято решение в значительной степени принять различные шаблоны без жалоб для простоты (поскольку они не являются вопросами правильности).