Xcode 4 автоматически генерирует iVars при использовании свойства @, где я могу найти официальный документ для этой функции?

Я прочитал "Что нового в Xcode", но я не могу найти официальное объяснение этой функции. Где я могу найти официальное объяснение? Какая документация? Спасибо.

Ответ 1

Вы можете найти это в документации Apple в Objective-C Язык программирования: Объявленные свойства в разделе "Директивы по реализации объектов". Независимо от того, синтезируется ли ivar, зависит от того, какое время работы вы используете:

Существуют различия в поведении синтезатора доступа, зависящие от времени выполнения (см. также "Разница времени выполнения" ):

  • Для устаревшей среды выполнения переменные экземпляра уже должны быть объявлены в блоке @interface текущего класса. Если переменная экземпляра с тем же именем, что и свойство существует, и если его тип совместим с типом свойств, он используется, иначе вы получите ошибку компилятора.
  • Для современных сред выполнения (см. "Версии среды выполнения и платформы" в Objective-C Руководство по программированию времени выполнения) переменные экземпляра синтезируются по мере необходимости. Если переменная экземпляра с тем же именем уже существует, она используется.

iOS всегда использует современную среду выполнения, поэтому вам не нужно явно объявлять ivars.

Ответ 2

Предполагая, что вы имеете в виду, что он автоматически генерирует методы ivar, getter и setter, даже если вы опускаете @synthesize: это по-разному называется синтезом свойств по умолчанию, автоматическим синтезом свойств и автосинтезом свойств.

Там не так много документации. Насколько мне известно, существует официальная документация нет о том, как она работает, только о том, что она существует.

Это действительно функция clang, а не функция Xcode. Он появился кратко в версии clang, поставляемой с Xcode 4.0 DP 4, но вскоре был удален из-за ошибок. Он появился в версии clang, поставляемой с Xcode 4.4. Вот коммит, который добавил его, я думаю.

Вы можете найти его в Objective-C Feature Availability Index.

Он также упоминается в Расширения языка Clang.

Из эксперимента:

  • Если вы явно не используете свойство @synthesize и генерируете переменную экземпляра, она автоматически генерирует ivar с тем же типом (и в соответствии с квалификацией собственности ARC) в качестве объявленного свойства. Имя ivar будет символом подчеркивания (_), за которым следует объявленное имя свойства.

  • Если вы не явно @synthesize a readonly, а do включите явный метод getter, тогда clang будет not автоматически генерирует ivar для вас.

  • Если вы не явно @synthesize a readwrite, а сделать, включите и явный getter и явный сеттер, затем снова clang будет не автоматически генерировать ivar для вас.

Но я не знаю никакой официальной документации об этих поведении.

Ответ 3

На самом деле это часть компилятора.

Вы можете прочитать это на веб-сайте LLVM .

Ответ 4

Я также обратил бы ваше внимание на Руководство по кодированию для Cocoa, которое советует:

  • Избегайте явного объявления переменных публичного экземпляра.

    Разработчики должны заботиться о интерфейсе объектов, а не о том, как он хранит свои данные. Вы можете избежать явного объявления переменных экземпляра с помощью объявленных свойств и синтеза соответствующей переменной экземпляра.