2009-02-11 5 views

ответ

2

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

13

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

Аксессуры будут (если вы не указали иначе) именовали propertyName и setPropertyName.

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

Таким образом, в вашей реализации класса:

  • self.bill = Фреда будет вызывать аксессора setBill.
  • bill = fred выставит счет на fred напрямую, не пройдя через аксессуар.
2

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

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

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

5

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

Причиной является сохранение количества не установлено при использовании MyVariable = OBJ и когда OBJ высвобождается отсчет теперь равно нулю. (Если вы не сохраните его самостоятельно), но, используя аксессуар, он будет делать счет за вас. (Снова предполагая, что вы настроили его на сохранение, когда оно было объявлено).

14

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

self.myVariable = obj; 

[self setMyVariable:obj]; 

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

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

4

Shyne

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

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

@synthesize myProp; 

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

self.myProp = newVal; 

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

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

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