Скажем, у меня есть класс со скалярным типом свойства:
@property (nonatomic, assign) int myInt;
И для ясности, синтезируемый как:
@synthesize myInt = _myInt;
Если бы кто-то спросил меня, будет ли работать следующая строка:
self.myInt++;
Я бы сказал «Нет». Причина в том, что мы все знаем, что оператор точки - это просто синтаксический сахар для вызова метода получения, созданного компилятором.Таким образом, эта строка буквально:
[self myInt]++;
Если вы введете эту вторую строку в Xcode, она не будет компилироваться, заявив: «Назначение 'readonly' возвращает результат сообщения objective-c не разрешено». В этом есть смысл, и я этого ожидал. Даже если бы это было скомпилировано, я ожидал бы, что результатом будет увеличение копии поддерживающего ivar в стеке, а не самого ivar.
Но инструкция self.myInt ++
компилируется и работает. Он работает так же, как если бы этот оператор точки имел прямой доступ к _myInt. Поставляя свои собственные геттеры и сеттеры, я вижу, что и геттер, и сеттер используются в процессе в том порядке, как это было на самом деле:
[self setMyInt:[self myInt] + 1];
Итак, это исключение из правила, что оператор точки точно так же, как вызов метода, или операторам {-, ++, + =, - =}
уделяется особое внимание компилятором Objective-C при использовании с точечной нотацией? Я всегда думал о них как о функциях языка C без каких-либо особых соображений для Objective-C. Я видел, что эта простая линия очень сбивает с толку тех, кто не знаком с точечной нотацией Objective-C.