Почему объявленное свойство использует и сохраняется, и только для чтения?

Я заметил, что некоторые из примеров 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 - но это было бы более запутанным, чем полезным. Существует также целый ряд различных крайних случаев в комбинациях, которые в равной степени заслуживают предупреждения, но на самом деле не указывают на реальную проблему. Было принято решение в значительной степени принять различные шаблоны без жалоб для простоты (поскольку они не являются вопросами правильности).

Другие вопросы по тегам