Ейко та інші дали правильні відповіді.
Ось простіший спосіб: безпосередній доступ до змінної private member.
Приклад
У заголовку .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 генерує метод getter з іменем foo
та setter з іменем setFoo
. Ці методи неявно викликаються, коли ви використовуєте позначення крапками (мій Object.myMethod). Якщо властивість оголошено readonly
, сеттер не генерується. Це означає, що змінна підтримки, названа символом підкреслення, не є самою для читання. У readonly
просто означає , що ні один метод не був сетера синтезований, і , отже , з допомогою точкової нотації , щоб встановити значення зазнає невдачі з помилкою компілятора. Позначення крапок не вдається, оскільки компілятор зупиняє вас від виклику методу (сеттера), який не існує.
Найпростіший спосіб цього - безпосередньо отримати доступ до змінної члена, названої підкресленням. Ви можете зробити це, навіть не оголошуючи змінну з підкресленим іменем! Xcode вставляє цю декларацію як частину процесу побудови / компіляції, тому ваш скомпільований код дійсно матиме декларацію змінної. Але ви ніколи не бачите цієї декларації у своєму вихідному файлі вихідного коду. Не магія, а просто синтаксичний цукор .
Використання self->
- це спосіб отримати доступ до змінної члена об'єкта / екземпляра. Можливо, ви можете це опустити, і просто використовуйте ім'я var. Але я волію використовувати стрілку self +, оскільки це робить мій код самодокументованим. Коли ви бачите, що self->_foo
ви знаєте без неоднозначності, що _foo
є змінною-членом у цьому екземплярі.
До речі, обговорення плюсів і мінусів власників прав доступу проти прямого доступу ivar - це саме той продуманий спосіб, який ви прочитаєте в книзі доктора Метта Нойберга з програмування iOS . Мені було дуже корисно читати та перечитувати.