В чем разница между доступом к переменной экземпляра через
self.mName = name;
против
mName = name;
Первый - это синтаксис доступа к свойству. Он преобразуется в сообщение доступа к объекту (в данном случае self
). То есть этот оператор неявно переводится в этот оператор выражения сообщения:
[self setMName:name];
(Неудобные имена аксессоров, подобные тому, почему «mName» является плохим именем для свойства. Существует синтаксис объявления свойства, чтобы обойти это, позволяя вам назвать свойство «name» и переменную вашего экземпляра «mName» и отобразить одно из них). к другому.)
Второй пример напрямую обращается к переменной экземпляра - сообщение доступа отсутствует.
Это не @property и не @ sythenize'd.
Скажи, что это все же, ...
Если для класса не объявлено свойство с именем «mName
», то вы не можете использовать синтаксис доступа к свойству для доступа к свойству с этим именем в экземпляре этого класса.
И не имеет значения, синтезируете ли вы методы доступа, передаете их вручную суперклассу с помощью @dynamic
или определяете их самостоятельно. Вот как объект будет реагировать на сообщение доступа, но сообщение доступа, генерируемое компилятором, не будет отличаться (поскольку доступ к свойству может быть так же легко получен извне класса, как и внутри него).
Скажите, что iVar не был IBOutlet:
Это не имеет значения. IBOutlet означает только что-либо для IB. Все остальное не волнует.
Фактически, IBOutlet в настоящее время является просто макросом, который расширяется до нуля. После предварительной обработки кода слово «IBOutlet» больше не существует, поэтому компилятор его никогда не видит. Вот как мало что это меняет во всем, кроме IB: вообще ничего.
Изменить в ответ на вопрос редактировать
Я сказал, mName
неверно как имя свойства из-за имен доступа, которые следуют из него. Имя переменной экземпляра - это отдельная проблема, тем более что свойство и ivar не обязательно должны иметь одно и то же имя.
Для переменной, будь то переменная экземпляра или локальная переменная, выбор name
или m_name
или mName
- это выбор стиля.
someMethod:
обычно является аксессором, setX:
. В этом методе self.x = x
, то есть [self setX:x]
, вызывает бесконечную рекурсию. Так что не делай этого.
Когда someMethod:
не является аксессором (или init
или dealloc
), использование свойства просто прекрасно и обычно предпочтительнее. Однако в этом случае вы вряд ли дадите одному из его аргументов то же имя, что и переменной экземпляра. Когда такой случай может произойти, назовите локальную переменную более конкретно, потому что ее цель более конкретна. Это тоже вопрос стиля.
Когда это метод доступа, я называю локальную переменную newX
, назвав переменную экземпляра так же, как свойство x
. Это мой личный стиль; Как я уже сказал, назовите свойство x
, ivar mX
и локальную переменную x
тоже хорошо (за исключением чрезмерной краткости этого примера).