Почему объявленное свойство использует и сохраняется, и только для чтения? - PullRequest
24 голосов
/ 19 декабря 2009

Я заметил, что некоторые примеры Apple включают модификаторы свойств retain и readonly. Какой смысл включать retain, если сеттер не генерируется при использовании модификатора readonly?

Пример: @property (retain, readonly) NSString *title; из примера AnimatedTableView.

Ответы [ 2 ]

36 голосов
/ 24 февраля 2010

Или, более конкретно, (только чтение, сохранение) включает шаблон, подобный этому:

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

17 голосов
/ 19 декабря 2009

Вы можете включить второе частное объявление readwrite в расширение класса. Схема управления памятью для всех ссылок должна соответствовать IIRC, поэтому вы получаете глупость типа «только чтение, сохранение».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...