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

Следующие не жалуются на компиляцию или время выполнения без 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 может привести к раздражениям, не оправданным удобством.

  • Действительное использование аксессуаров в методах init и dealloc?
  • C # настройка / получение свойств classа по имени строки
  • Свойство getter / setter не влияет на Python 2
  • Могу ли я переопределить свойство в c #? Как?
  • В чем разница между свойством зависимостей и прикрепленным свойством в WPF?
  • Как я могу оценивать код C # динамически?
  • Загрузить файл свойств в Servlet / JSP
  • Как проверить, имеет ли объект определенный метод / свойство?
  • В чем разница между свойством Property и Dependency Property
  • Схема базы данных, которая может поддерживать специализированные свойства
  • Являются ли функции get и set популярными у программистов на C ++?
  • Interesting Posts

    Entity Framework создает множественное имя таблицы, но представление ожидает уникальное имя таблицы?

    Вырезать последние 30 секунд концы видео с помощью ffmpeg в пакетном файле в Windows

    Хэш-карта на основе диска

    Динамический диапазон диаграмм с помощью INDIRECT: эта функция недействительна (несмотря на выделение диапазона)

    Почему LinkedHashSet расширяет HashSet и реализует Set

    Получение LaTeX в R-графиках

    visual c ++: # включить файлы из других проектов в одном решении

    Как масштабировать bitmap до размера экрана?

    Пример System.Net.FtpWebRequest GetDateTimestamp

    В чем разница между библиотекой пользовательского контроля и библиотекой пользовательского контроля?

    Gradle не включает зависимости в опубликованном pom.xml

    Android – многолинейная линейная компоновка

    Есть ли необходимость безопасного удаления устройства, если включено «Быстрое удаление»?

    Проверка эффективности ViewModel в Best Practices в ASP.NET MVC

    Параметры операций в диаграмме классов Visio

    Давайте будем гением компьютера.