2017-02-20 44 views
0

Можно ли считать, что компилятор никогда не изменит порядок присвоения свойств? Учитывайте следующее:Неверное выполнение 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 является частью библиотеки, тогда он не может даже знать эту информацию до времени ссылки, что может быть слишком поздно, чтобы выполнить переупорядочение? Итак, можно ли предположить, что компилятор никогда не изменит порядок присвоений? Конечно, ивары - это еще одна история.

+4

Я не могу на данный момент предложить прямой источник для этого, но вы должны иметь возможность предположить, что присвоения свойств не могут быть переупорядочены. Синтаксис синтаксиса - это синтаксический сахар для вызовов методов, и поскольку Objective-C является динамическим языком, невозможно узнать, к чему будет обращаться вызов метода, пока вы его не попробуете. Поэтому неверно переупорядочивать вызовы методов. Если компилятор переупорядочивает такие вызовы, это почти наверняка будет ошибкой. –

+0

Как вы упомянули, ивары - это другой стадион. Доступ к ivar обеспечивает прямой доступ к памяти, поэтому компилятор может выбрать реорганизацию. –

ответ

2

Компилятор не может переупорядочить присвоения свойств, поскольку он не может знать, что поведение кода останется постоянным во время выполнения.

a.x = 10 точно такой же, как [a setX: 10], и, таким образом, проходит динамическую отправку. Поскольку он является динамическим, потенциальные побочные эффекты упомянутого вызова не могут быть известны во время компиляции.

Рассматривается динамическая отправка момента, когда компилятор не может выполнить повторное выполнение.

+0

Можем ли мы быть уверенными, что компилятор недостаточно умен, чтобы анализировать объекты и выяснить, нужна ли динамическая отправка или нет для некоторых вызовов методов, а также их линией, а затем выполняется переупорядочение? –

+0

@JohnK Да. Определенный. В любой момент времени любой ошибочный кодер может разворачивать код, который редактирует среду выполнения с весьма сомнительными способами, так что любой данный путь выполнения становится действительно запутанным. – bbum