2012-06-20 2 views
3

Зачем определять переменные дважды в файле заголовка? Какие различия между этими переменными?Почему я должен определять переменные дважды в файле заголовка?

Первое определение здесь:

@interface MyController: UIViewController 
{ 
    NSInteger selectedIndex; 
} 

Второе определение здесь:

@property (nonatomic) NSInteger selectedIndex; 
+2

Пожалуйста, добавьте тег языка к вашему вопросу – Shahbaz

+0

В текущей версии Xcode вам даже не нужен @synthesize. Просто определите свое свойство, а компилятор сделает все остальное. – physics90

+0

Возможный дубликат: http://stackoverflow.com/questions/11033775/objective-c-multiple-declarations-of-instance-variables-properties – viral

ответ

6

То, что вы видели, было необходимо в более ранних версиях Objective-C, , но это уже не так.

В первых версиях Objective-C не используются NeXT до тех пор новая среды была введена (с Objective-C 2.0 на Mac OS X), все переменных экземпляра должны был быть объявлен как часть структуры класса в своем @interface. Причина заключалась в том, что если вы подклассифицировали класс, , то компилятор должен был знать макет переменной экземпляра класса , чтобы он мог видеть, при каком смещении следует перечислить переменные подкласса .

Когда свойства были введены, синтезированные свойства должны были быть «подкреплены» переменной экземпляра в структуре класса. Поэтому вам нужно было объявить как переменную экземпляра, так и свойство.

Все вышеизложенное перестает быть верным. Новые Objective-C является менее хрупким в том, как она смотрит на переменное смещение экземпляра, который означал несколько изменений:

  • не все переменные экземпляра должна быть в @interface. Теперь они могут быть определены в @implementation: хотя не в категориях, связанных с , возможностям столкновения и другим проблемам.
  • переменные экземпляра для синтезированных свойств могут быть выведены и созданы на основе определения свойства.
  • Вы можете программно добавлять переменные экземпляра в классы, которые вы создаете во время выполнения (только до того, как вы зарегистрировали класс как , доступный для системы).

Таким образом, чтобы подтвердить, вы только нужно объявить как переменный экземпляр и синтезированное свойство в старых версиях языка Objective-C. То, что вы видите, избыточно и не должно быть считаться «лучшей практикой».

[Source]

3

В современном режиме исполнения не нужно объявлять их дважды. Просто используйте:

В .h вы

@property (nonatomic) NSInteger selectedIndex; 

часть между {} является декларация Ивар. И с вашим @property вы объявляете getter и seters. В современной среде исполнения, если вы просто используете код выше, вы говорите в основном то же самое (ваш iVar теперь _selectedIndex).

+3

В современном режиме исполнения вам не нужно '@ синтезировать'. – David

+0

@ Давид это правильно. На момент написания мой код был прав. В настоящее время вам больше не нужен '@ synhesize'. Исправлен мой код для реальной ситуации ... – Pfitz

4

Как уже отмечалось, это больше не нужно объявлять резервное переменную экземпляра для синтезированного свойства в заголовке.

Чтобы сделать это немного яснее: Что вы видите, это не два объявления одной и той же переменной, это одно объявление переменной и одно объявление свойства .

Свойство - это в основном набор методов (в данном случае selectedIndex и setSelectedIndex:), которые обычно используются для доступа к переменным экземпляра. Существует различие между свойством и переменной экземпляра. Установщик/получатель свойств мог бы сделать больше, чем просто установить переменную, в вашем примере она также может быть, например, обновить пользовательский интерфейс, чтобы отразить изменение выбранного индекса, или геттер мог бы вывести индекс из какой-либо другой переменной (в этом случае может быть указательный путь выбора) и т. д.

Синтезируя свойство просто освобождает вас от реализации эти методы сами и предоставляют вам реализации по умолчанию, которые просто устанавливают переменную, но вы также можете реализовать selectedIndex и setSelectedIndex: сами, как и любой другой метод, и в этом случае вам может понадобиться сама переменная экземпляра или вообще опустить ее (в случае вывода имущество).

Смежные вопросы