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".

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

Ответ 1

В вашем .h:

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

В вашем .m:

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

Ответ 2

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

@property(nonatomic, readonly) NSDate* theDate;

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

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

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

@implementation TheClassName
@synthesize theDate = _theDate;

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

_theDate = [NSDate date];

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

Ответ 3

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

Ответ 4

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

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