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