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