iOS при использовании переменной экземпляра или метода получения - PullRequest
6 голосов
/ 06 февраля 2012

У меня есть вопрос об использовании геттеров и переменных экземпляра.Давайте рассмотрим пример.

Предположим, у меня есть файл .h:

@property (nonatomic,strong) NSString *name

, а в файле .m я синтезирую эту переменную следующим образом:

@synthesize name = _name;

Теперь мой вопрос: в чем разница между использованием:

[self.name aMethod]

и

[_name aMethod]

Спасибо!

Ответы [ 3 ]

8 голосов
/ 06 февраля 2012

Первый обращается к ивару через метод получения.Второй напрямую обращается к ивару.Поскольку это простое, синтезированное свойство, нет большой разницы, за исключением того, что первый делает дополнительный вызов метода.Однако, если бы свойство было атомарным, или динамическим, или метод получателя был сложным, было бы различие в том, что первое действительно было бы атомарным, а второе - нет, а первое фактически вызывало бы любую сложную логикуgetter, в то время как второй не будет.

Проще говоря, компилятор перезаписывает первый вызов:*

1 голос
/ 06 февраля 2012
[self.name aMethod]

эквивалентно

[[self name] aMethod]

Таким образом вызывается метод получения и сообщение отправляется с его результатом.

В вашем случае видимый результат будет таким же.

Однако это может быть не так, если геттер не был тривиальным (то есть синтезированным).

0 голосов
/ 06 февраля 2012

Первые звонки через геттер - он равен [[self name] aMethod].Второй просто использует прямой доступ.

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

Более полный список причин можетможно найти здесь: Зачем вам использовать ивар?

...