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

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

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

24
задан Josh Caswell 9 May 2014 в 08:27
поделиться

2 ответа

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

17
ответ дан 28 November 2019 в 23:04
поделиться

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

36
ответ дан 28 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: