Objective-C: (private/public properties) делает свойство readonly для вызовов внешнего класса и readwrite для самостоятельных вызовов

Вы знаете способ сделать свойство readonly для внешних вызовов и readwrite для внутренних вызовов?

Я читал раз назад что-то вроде

В .h

@property(nonatomic, readonly) NSDate* theDate;

В .m

@interface TheClassName()
@property(nonatomic, retain) NSDate* theDate;
@end

но это вызывает предупреждение при компиляции атрибута .m "Свойство theDate в продолжении класса TheClassName не соответствует классу Свойство TheClassName".

Во всяком случае, похоже, он работает (может читать, но не устанавливать извне класса, может делать как изнутри), но я должен был пропустить что-то, чтобы избежать предупреждения. Или если вы знаете лучший способ сделать это...

4b9b3361

В вашем .h:

@property(nonatomic, retain, readonly) NSDate* theDate;

В вашем .m:

@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end
61
ответ дан 29 янв. '11 в 18:17
источник

Эта проблема во многом устраняется, если вы переходите к ARC. Вместо двух объявлений свойств вы объявите их один раз в заголовке.

@property(nonatomic, readonly) NSDate* theDate;

И затем в расширении класса просто объявите переменную экземпляра __strong.

@interface TheClassName()
{
    __strong NSDate* _theDate;
}
@end

И соответствующим образом синтезируйте их в реализации

@implementation TheClassName
@synthesize theDate = _theDate;

Теперь вы можете установить переменную экземпляра.

_theDate = [NSDate date];

И ARC волшебным образом включит соответствующие функции сохранения/выпуска в ваш код, чтобы рассматривать его как сильную/сохраненную переменную. Преимущество этого заключается в том, что он быстрее, чем свойства старого стиля (сохранение), а также ARC строит код сохранения/выпуска во время компиляции.

3
ответ дан 26 июля '12 в 21:33
источник

Если свойство поддерживается переменной, переменная является read-write изнутри класса по умолчанию. Сделайте свойство доступным только для чтения, и ваша цель дизайна будет выполнена. Внутри класса обратитесь к переменной без добавления self..

-1
ответ дан 29 янв. '11 в 18:18
источник

В .m вы не должны снова ставить @property. Я не уверен, какой эффект это имеет. Вы имели в виду использовать @synthesize?

Обратите внимание, что theDate будет постоянно читаться/записываться внутри реализации класса, независимо от того, будет ли он доступен только для внешнего мира.

-2
ответ дан 29 янв. '11 в 18:09
источник