Смешивание C до / после увеличения / уменьшения с помощью оператора Objective-C работает? - PullRequest
16 голосов
/ 29 октября 2011

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

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

1 Ответ

12 голосов
/ 29 октября 2011

Вы можете посмотреть на вывод ассемблера и увидеть, что он генерирует два вызова _objc_msgSend.

Я думаю, это скорее случай применения правила, что a++ является синтаксическим сахаром для a = a + 1

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