self.variable и переменная разница

В чем разница между self.myVariable = obj; и myVariable = obj;, когда я использую @propery/@synthesize для создания `myVariable?


person Shyne    schedule 11.02.2009    source источник


Ответы (6)


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

self.myVariable = obj;

[self setMyVariable:obj];

objc_msgSend(self, @selector(setMyVariable:), obj);

Конечно, это означает, что использование точечного синтаксиса на самом деле приводит к полной отправке сообщения, что означает вызов новой функции и всех связанных с ней накладных расходов. Напротив, использование простого присваивания (myVariable = obj;) не влечет за собой никаких издержек, но, конечно, его можно использовать только в методах экземпляра рассматриваемого класса.

person rpj    schedule 20.02.2009

Директива @synthesize указывает компилятору генерировать методы доступа для ваших переменных-членов в соответствии со спецификациями, указанными в директиве @property в вашем файле .h. (То есть, если вы укажете сохранить, сеттер сохранит переменную, а если вы укажете копирование, он скопирует ее.)

Методы доступа (если не указано иное) будут называться propertyName и setPropertyName.

С помощью . нотация (обратите внимание, а не синтаксис self, как указано выше) говорит о том, что вы хотите использовать методы доступа (хорошо, если вы устанавливаете строки и хотите, например, убедиться, что счетчик сохранения правильный).

Итак, в реализации вашего класса:

  • self.bill = fred вызовет метод доступа setBill.
  • bill = fred установит для счета значение fred напрямую, минуя аксессор.
person Jane Sales    schedule 11.02.2009

Одно из отличий, которое я обнаружил при запуске разработки Cocoa, заключается в том, что я установил переменную для использования синтаксиса @Property/@Synthesize и не использовал self.myVariable = obj или [self setMyVariable :obj], но вместо myVariable = obj объект не сохраняется, если obj освобождается позже. (Предположим, что @Property настроен на сохранение.)

Причина в том, что счетчик сохранения не установлен при использовании myVariable = obj, и когда obj освобождается, счетчик теперь равен нулю. (Если вы не сохраните его самостоятельно). Но с помощью аксессора он сделает за вас подсчет удержания. (Опять же, предполагая, что вы настроили его на использование сохранения, когда оно было объявлено).

person Niels Hansen    schedule 16.02.2009

Шайн

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

Если вы создаете синтезированное свойство

@synthesize myProp;

Всегда используйте шаблон self.myProp для его установки.

self.myProp = newVal;

Это кажется очевидным, но это важно. Это правда, что для этого просто нет причин, но пока вы действительно не поймете, как создаются синтезированные сеттеры, вы просто хотите предположить, что вы ДОЛЖНЫ использовать себя. шаблон для установки значения.

Честно: это сэкономит вам много ночных сеансов отладки. Нарушения доступа к неудерживаемой памяти просто хуже всего отлаживать.

person bladnman    schedule 12.10.2010

Синтаксис self использует метод доступа, а другой синтаксис — нет. Это может иметь большое значение, если метод доступа делает что-то большее, чем просто присваивает новое значение. См. Объявленные свойства часть учебника по Objective-C.

person zoul    schedule 11.02.2009

Другие ответы верны, разница в том, что запись через точку приводит к изменению ивара через аксессуар, а не напрямую.

Пока вы не знаете, что делаете, я рекомендую использовать точечную нотацию (т. е. self.propertyName = ...). Cocoa/Obj-C много делает с кодированием ключ-значение, и хотя телефонный SDK не использует это в полной мере (с такими вещами, как привязки), в конечном итоге это произойдет. Привыкнув к использованию средств доступа сейчас, вы избавите себя от головной боли в будущем.

Использование методов доступа также дает вам возможность переопределить их и предоставить дополнительные функциональные возможности, если вам это нужно. Просто изменяя значение ivar, вы лишаете себя этой возможности.

person August    schedule 11.02.2009