Какова цель ивара, когда существует свойство?

Следующие не жалуются на компиляцию или время выполнения без name ivar. Итак, почему так часто можно увидеть ivar и @property/@synthesize synhesize.

 @interface PropTest : NSObject { } @property (retain) NSString *name; @end @implementation PropTest @synthesize name; @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; PropTest *p = [[PropTest new] autorelease]; p.name = @"Hello, World!"; NSLog(@"%@",p.name); [pool drain]; return 0; } 

Этот код печатает

 Hello, World! 

На самом деле, если я получаю доступ к p->name , я получаю предупреждение:

 warning: instance variable 'name' is @private; this will be a hard error in the future 

что указывает на то, что ivar создан для меня, если он не существует.

Если это правда, то в чем смысл создания ivar вручную (игнорируя очевидное, что иногда существуют веские причины не использовать g / setter accessor)?

Или спросил по-другому, должен ли я когда-либо создавать ivar для свойства, когда мне нужно обходить аксессоров?

Синтезированные ивары (возможность не объявлять вручную ivars) – это особенность новой среды выполнения Objective-C, которая до сих пор не используется во всех системах. Для 32-битных Mac (и до недавнего времени имитатора iPhone) вам нужно вручную объявить ivars. Если вы используете только системы таргетинга с новой средой выполнения, нет никаких причин вручную объявлять ivars.

Ответ eman является правильным в целом, но есть одна причина, чтобы все еще объявлять ivars даже в новой среде выполнения: Apple отговаривает синтезированные аксессоры в методах init и dealloc. По существу, получателям и сеттерам разрешено иметь побочные эффекты, отличные от установки переменной. В частности, они могут инициировать уведомления KVO. С ivar, чтобы поговорить, вы можете просто отправить release и сделать с ним. Но если все, что у вас есть, это свойство, ваш единственный выбор – установить его и надеяться, что вы избежите любых неудачных взаимодействий.

Честно говоря, я не уверен, насколько большая проблема на практике. Я просто суеверно избегал этого, хотя я втайне сомневаюсь, что это вызовет проблему в большинстве случаев. Но Apple делает это в документах, поэтому я предполагаю, что есть некоторые причины для беспокойства.

Две не очень хорошие, но необходимые причины, чтобы убедиться, что свойства подкреплены ivars:

  1. По какой-то причине отладчик XCode не показывает свойства, в которых явно не указаны соответствующие ivars.
  2. Мне кажется, что при некоторых обстоятельствах использование @property без ivar может скрыть другие ivars, что приводит к ошибкам компиляции (см. Почему подclass @property без соответствующего ivar скрывает суперкар Iars? )

Если у меня есть неправильные концы пары палочек здесь, я думаю, что использование @property без явных ivars может привести к раздражениям, не оправданным удобством.

  • Свойства и переменные экземпляра в Objective-C
  • Когда я должен использовать @synthesize явно?
  • Как заполнить HashMap из файла свойств java с помощью Spring @Value
  • Свойства системы Java и переменные среды
  • Есть ли причина объявлять ivars, если вы используете свойства исключительно в Objective-C?
  • Объект C - свойство Synthesize
  • 'свойство: 0' или 'свойство: 0px' в CSS?
  • Обратный вызов, когда свойство зависимостей получает изменение xaml
  • Обновление значения свойства в файле свойств без удаления других значений
  • Когда использовать свойства вместо функций
  • Свойство '' не найдено на объекте типа 'id'
  • Давайте будем гением компьютера.