Эйко и другие дали правильные ответы.
Вот более простой способ: получить прямой доступ к частной переменной-члену.
пример
В заголовочном файле .h:
@property (strong, nonatomic, readonly) NSString* foo;
В файле реализации .m:
self->_foo = @"someString";
Вот и все, что вам нужно. Ни суеты, ни суеты.
Детали
Начиная с Xcode 4.4 и LLVM Compiler 4.0 ( новые функции в Xcode 4.4 ), вам не нужно возиться с рутинной работой, описанной в других ответах:
synthesize
ключевое слово
- Объявление переменной
- Повторное объявление свойства в файле .m реализации.
После объявления свойства foo
, можно предположить , Xcode добавила закрытую переменную с именем с префиксом подчеркивания: _foo
.
Если свойство было объявлено readwrite
, Xcode генерирует названный метод получения и названный foo
установщик setFoo
. Эти методы неявно вызываются, когда вы используете точечную нотацию (мой Object.myMethod). Если свойство было объявлено readonly
, сеттер не создается. Это означает, что поддерживающая переменная, названная с подчеркиванием, не предназначена только для чтения. Это readonly
просто означает, что метод установки не был синтезирован, и поэтому использование точечной записи для установки значения завершается ошибкой компилятора. Точечная нотация не работает, потому что компилятор не дает вам вызвать метод (установщик), который не существует.
Самый простой способ обойти это - получить прямой доступ к переменной-члену, названной с подчеркиванием. Вы можете сделать это даже без объявления этой переменной с именем подчеркивания! Xcode вставляет это объявление как часть процесса сборки / компиляции, поэтому ваш скомпилированный код действительно будет иметь объявление переменной. Но вы никогда не увидите этого объявления в исходном файле исходного кода. Не волшебство, просто синтаксический сахар .
Использование self->
- это способ доступа к переменной-члену объекта / экземпляра. Вы можете опустить это и просто использовать имя переменной. Но я предпочитаю использовать стрелку self +, потому что она делает мой код самодокументированным. Когда вы видите, self->_foo
вы без двусмысленности знаете, что _foo
это переменная-член в этом экземпляре.
Между прочим, обсуждение преимуществ и недостатков средств доступа к свойствам по сравнению с прямым доступом к ivar - это именно та продуманная трактовка, которую вы прочтете в книге доктора Мэтта Нойберга « Программирование iOS» . Мне было очень полезно читать и перечитывать.