Зачем вызывать «self.classVariable», когда вы можете просто вызвать «classVariable»? - PullRequest
1 голос
/ 25 января 2011

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

If self.classVariable = sandwich; 

&

If classVariable = sandwich; 

делают то же самое.

Может кто-нибудь объяснить смысл дополнительного набора текста?

Ответы [ 3 ]

2 голосов
/ 25 января 2011

В Objective-C self.property - это свойство доступ, а не прямой доступ к переменной экземпляра. Это синтетический сахар для [self property] или [self setProperty:], и поэтому имеет семантику сообщения. Современная среда выполнения Objective C может синтезировать резервную копию экземпляра (с тем же именем, что и у свойства), но вы можете создать резервную копию свойства с переменной экземпляра с другим именем или вообще без него. Другими словами,

self.property = foo;
id bar = property

и

property = foo;
id bar = property;

совсем не одно и то же.

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

0 голосов
/ 25 января 2011

Если вы пройдете через аксессор, вы можете установить точки останова там.Удобно иногда.Также такие вещи, как свойства сохранения / копирования, не будут работать, если вы не пройдете через средство доступа.

0 голосов
/ 25 января 2011

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

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

В частности, для Objective-C есть еще одно отличие, отмеченное здесь http://answers.oreilly.com/topic/1193-calling-self-object-rather-than-calling-the-object-directly-in-objective-c/

Нотация SELF.X проходит через методы доступа, сгенерированные директивой @synthesize, тогда как X напрямую их обходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...