Ответ 1
В вашем .h:
@property(nonatomic, retain, readonly) NSDate* theDate;
В вашем .m:
@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end
Вы знаете способ сделать свойство readonly для внешних вызовов и readwrite для внутренних вызовов?
Я читал раз назад что-то вроде
В .h
@property(nonatomic, readonly) NSDate* theDate;
В .m
@interface TheClassName()
@property(nonatomic, retain) NSDate* theDate;
@end
но это вызывает предупреждение при компиляции атрибута .m "Свойство theDate в продолжении класса TheClassName не соответствует классу Свойство TheClassName".
Во всяком случае, похоже, он работает (может читать, но не устанавливать извне класса, может делать как изнутри), но я должен был пропустить что-то, чтобы избежать предупреждения. Или если вы знаете лучший способ сделать это...
В вашем .h:
@property(nonatomic, retain, readonly) NSDate* theDate;
В вашем .m:
@interface TheClassName()
@property(nonatomic, retain, readwrite) NSDate* theDate;
@end
Эта проблема во многом устраняется, если вы переходите к ARC. Вместо двух объявлений свойств вы объявите их один раз в заголовке.
@property(nonatomic, readonly) NSDate* theDate;
И затем в расширении класса просто объявите переменную экземпляра __strong.
@interface TheClassName()
{
__strong NSDate* _theDate;
}
@end
И соответствующим образом синтезируйте их в реализации
@implementation TheClassName
@synthesize theDate = _theDate;
Теперь вы можете установить переменную экземпляра.
_theDate = [NSDate date];
И ARC волшебным образом включит соответствующие функции сохранения/выпуска в ваш код, чтобы рассматривать его как сильную/сохраненную переменную. Преимущество этого заключается в том, что он быстрее, чем свойства старого стиля (сохранение), а также ARC строит код сохранения/выпуска во время компиляции.
Если свойство поддерживается переменной, переменная является read-write изнутри класса по умолчанию. Сделайте свойство доступным только для чтения, и ваша цель дизайна будет выполнена. Внутри класса обратитесь к переменной без добавления self.
.
В .m вы не должны снова ставить @property. Я не уверен, какой эффект это имеет. Вы имели в виду использовать @synthesize?
Обратите внимание, что theDate будет постоянно читаться/записываться внутри реализации класса, независимо от того, будет ли он доступен только для внешнего мира.