Эйко и другие дали правильные ответы.
Вот более простой способ: Прямой доступ к закрытой переменной-члену.
Пример
В шапке .h файла:
@property (strong, nonatomic, readonly) NSString* foo;
В файле реализации .m:
// inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
Вот и все, это все, что вам нужно. Нет суеты, нет суеты.
Детали
Начиная с 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
является переменной-членом в этом экземпляре.
Кстати, обсуждение плюсов и минусов средств доступа к свойствам в сравнении с прямым доступом к ивару - это именно та забота, которую вы прочтете в докторе Мэтт Нойберг 1063 * Программирование iOS книга. Мне было очень полезно читать и перечитывать.