Можно ли считать, что компилятор никогда не изменит порядок присвоения свойств? Учитывайте следующее:Неверное выполнение Objective-C
@interface ObjA
@property int x;
@property int y; // When YES, x guaranteed to be set to 10.
@end
ObjA a;
ObjB b;
[a addObserver:b forKeyPath:@"y" options:nil context:&context]
a.x = 10;
a.y = YES;
Будет ли х всегда назначаться до у или нам нужно вставить барьер памяти?
Я знаю, что компилятор должен проверять зависимости, чтобы убедиться, что безопасно назначать a.y перед a.x, но для этого здесь нужно будет смотреть на все реализации во всех наблюдателях. Если ObjA является частью библиотеки, тогда он не может даже знать эту информацию до времени ссылки, что может быть слишком поздно, чтобы выполнить переупорядочение? Итак, можно ли предположить, что компилятор никогда не изменит порядок присвоений? Конечно, ивары - это еще одна история.
Я не могу на данный момент предложить прямой источник для этого, но вы должны иметь возможность предположить, что присвоения свойств не могут быть переупорядочены. Синтаксис синтаксиса - это синтаксический сахар для вызовов методов, и поскольку Objective-C является динамическим языком, невозможно узнать, к чему будет обращаться вызов метода, пока вы его не попробуете. Поэтому неверно переупорядочивать вызовы методов. Если компилятор переупорядочивает такие вызовы, это почти наверняка будет ошибкой. –
Как вы упомянули, ивары - это другой стадион. Доступ к ivar обеспечивает прямой доступ к памяти, поэтому компилятор может выбрать реорганизацию. –