В чем разница между self.myVariable = obj;
и myVariable = obj;
, когда я использую @propery
/@synthesize
для создания `myVariable?self.variable и переменная разница
ответ
Синтаксис self
использует метод доступа, другой синтаксис - нет. Это может быть большой разницей, если аксессор делает что-то большее, чем просто присваивает новое значение. См. Раздел Declared Properties учебника Objective-C.
Директива @synthesize сообщает компилятору о создании аксессуаров для ваших переменных-членов в соответствии со спецификациями, указанными в директиве @property в вашем .h-файле. (I.e., если вы укажете сохранение, сеттер сохранит переменную, и если вы укажете копию, она скопирует ее.)
Аксессуры будут (если вы не указали иначе) именовали propertyName и setPropertyName.
Использование. нотация (примечание, а не сам синтаксис, как указано выше) говорит о том, что вы хотите использовать аксессоров (хорошо, если вы устанавливаете строки, и хотите, чтобы, например, подсчет сохранения был правильным).
Таким образом, в вашей реализации класса:
- self.bill = Фреда будет вызывать аксессора setBill.
- bill = fred выставит счет на fred напрямую, не пройдя через аксессуар.
Другие ответы верны, разница заключается в том, что точечное обозначение заставляет ivar быть замененным аксессуаром, а не напрямую.
Пока вы не знаете, что делаете, я рекомендую использовать точечную нотацию (то есть self.propertyName = ...
). Cocoa/Obj-C делает многое с кодированием по ключевым словам, и хотя SDK телефона не в полной мере использует это (с такими вещами, как привязки), в конечном итоге это произойдет. Привыкание к использованию аксессуаров теперь сэкономит вам много головных болей в будущем.
Использование методов доступа также дает вам возможность переопределить их и предоставить больше возможностей, если вам нужно. Просто изменив значение ivar, вы лишите себя этой возможности.
Одно из отличий я обнаружил, когда начала разработки какао, если я установить переменную использовать @ собственности/@ синтезируют синтаксис и я не использовал self.myVariable = OBJ или [собственного setMyVariable: OBJ], но вместо этого myVariable = obj, объект не сохраняется, если obj выпущен позднее. (Предполагая, что @property был настроен на использование сохранения.)
Причиной является сохранение количества не установлено при использовании MyVariable = OBJ и когда OBJ высвобождается отсчет теперь равно нулю. (Если вы не сохраните его самостоятельно), но, используя аксессуар, он будет делать счет за вас. (Снова предполагая, что вы настроили его на сохранение, когда оно было объявлено).
Важно отметить, что точечный синтаксис преобразуется в простой вызов objc_msgSend компилятором: это означает, что под ним действует точно так же, как сообщение посылает аксессуар для этой переменной.Таким образом, все три из следующих эквивалентны:
self.myVariable = obj;
[self setMyVariable:obj];
objc_msgSend(self, @selector(setMyVariable:), obj);
Конечно, это означает, что, используя точечную-синтаксис фактически приводит к полному сообщению отправки, то есть вызов новой функции и все накладные расходы, что связано с ним , Напротив, использование простого назначения (myVariable = obj;) не несет ни одного из этих накладных расходов, но, конечно, его можно использовать только в методах экземпляра рассматриваемого класса.
Shyne
Если я могу добавить к этому важное замечание. Ответ выше - все это потрясающе, поэтому я не буду добавлять техническую сторону. Но как раз это:
Если вы создаете синтезированный свойство
@synthesize myProp;
Всегда используйте self.myProp шаблон, чтобы установить его.
self.myProp = newVal;
Это кажется действительно очевидным, но это важно. Это правда, что нет оснований для этого, но пока вы действительно не поймете, как создаются синтезированные сеттеры, вы просто хотите предположить, что вам нужно использовать самость. чтобы установить значение.
Честный: это сэкономит вам много сеансов отладки в ночное время. Недопустимые нарушения доступа к памяти - это просто худшее для отладки.
- 1. Инициализатор с self.variable = переменная
- 2. Разница между self.variable и _variable, о KVO
- 3. Разница между self.variable name и classname.variable в python
- 4. Целевая разница C между self.variable и переменными присваиваниями
- 5. В чем разница между self.variable и self-> variable?
- 6. Разница между использованием self.variable и _variable при инициализации этих переменных
- 7. В чем разница между _variable & self.variable в Objective-C?
- 8. Трассировка self.variable
- 9. Использование переменных экземпляра и self.variable
- 10. Разница между нулем! = Переменная и переменная! = Null
- 11. php3 и php Переменная разница
- 12. $ .fn и именованная переменная разница?
- 13. путаница между self.variable и переменной в классе в python
- 14. Python self.variable vs private member variable variable
- 15. Цель C _underscore vs self.variable
- 16. Есть ли разница, использующая self.variable = 'some value' только для переменной = 'some value' для переменных экземпляра
- 17. Разница в производительности: переменная класса и переменная метода
- 18. Makefile, какова разница между OBJ _ $ (переменная) и $ (addprefix "obj_", $ (переменная))
- 19. В чем разница между использованием self._variable и просто self.variable в конструкторе в Python
- 20. Powershell переменная Допрос даты и времени Разница
- 21. разница между C++ (переменной) и (переменная ++)
- 22. разница между if (!! variable) и, если (переменная)?
- 23. MySQL: переменная @variable. Какая разница?
- 24. Метод Python должен знать, что self.variable изменен
- 25. Быстрая слабая переменная поведенческая разница?
- 26. Что значит «self.variable = self» в python
- 27. В инфраструктуре Tornado python переменная экземпляра и переменная переменной confusion
- 28. чем разница между $ объекта :: переменной $ и $ object-> переменная
- 29. Разница между [переменной объекта] и объектом. Переменная в Obj-C?
- 30. Разница между терминами «переменная экземпляра» и «переменные, объявленные в интерфейсах»