что будет делать переменная @synthesize = _variable?

Например, я видел такой код в делегате приложения в проекте iPhone.

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

также при выпуске переменной я должен использовать:

  [variable release]; 

или

 [_variable release]; 

Спасибо.


person Samssom    schedule 29.06.2011    source источник


Ответы (3)


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

@synthesize variable = _variable 

Создает сеттер и геттер, которые устанавливают/получают переменную, которую вы установили, в данном случае _variable. Таким образом, внешний доступ использует такой код, как object.variable, который на самом деле просто возвращает _variable. однако класс обычно использует _variable внутри.

person Justin Meiners    schedule 29.06.2011
comment
Это старый пост, но я хотел бы уточнить. Создает ли это сеттер и геттер, поэтому простое использование object.variable в любом месте будет вести себя так, как должно? Или мне все еще нужно определить сеттер и геттер в дополнение к этому? - person muttley91; 10.06.2013
comment
@rar, если вы @property и @synthesize, сеттер и геттер созданы для вас. После этого вы можете получить доступ к object.variable. - person Justin Meiners; 10.06.2013
comment
Вау, я написал тогда кучу ненужного кода (потому что выписал геттеры). Спасибо! - person muttley91; 10.06.2013
comment
@rar особенно полезен для сохраненных свойств - много кода, который вы не хотите писать :) - person Justin Meiners; 10.06.2013

@synthesize variable = _variable;

Имя свойства — «variable», а резервная переменная экземпляра — «_variable». Вы должны использовать методы доступа -variable и -setVariable:, а не обращаться к ivar напрямую, за исключением -init и -dealloc, где вы должны использовать _variable.

person Caleb    schedule 29.06.2011

В вашем примере переменная является свойством, а _variable является переменной экземпляра. Для простоты мы можем сказать, что синтезируя, вы, по сути, указываете, что свойство (в нашем случае переменная) будет использовать переменную экземпляра (в нашем случае _variable) для хранения и извлечения значений. На самом деле вы указываете компилятору создавать реализации, соответствующие спецификации, указанной в объявлении свойства.

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

Если вы не использовали свойство, вы можете вызвать выпуск для переменной экземпляра, а затем в идеале вы хотите установить его равным нулю.

person Vidyanand    schedule 29.06.2011