Смешивание пре / пост инкремента / декремента C с оператором точки Objective-C работает?

Скажем, у меня есть класс со скалярным типом свойства:

@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.

16
задан Machavity 15 August 2017 в 17:42
поделиться