Код не работает после развертывания

У меня есть следующий код в потоке в моем приложении:

while (true) {
    if (ready) {
        progressIndicatorController.value++;
        return;
    }
}

Готовая переменная изменяется из метода делегата. Этот код отлично работает, когда я открываю приложение, нажимая кнопку «Выполнить» на панели инструментов Xcode. Однако, если я открою .app этого приложения (которое я создаю, щелкнув «Продукт»> «Архив», а затем следуя инструкциям), этот код почему-то больше не работает.

progressIndicatorController.value никогда не увеличивается, и этот оператор if никогда не оценивается как true. Что может вызвать эту проблему?


person Frog    schedule 04.01.2013    source источник


Ответы (1)


Вероятно, это вызвано оптимизацией компилятора.

Когда вы строите с помощью Archive, XCode включает оптимизацию в компиляторе, которая может отбрасывать такой код. Я думаю, что установка переменной ready на volatile может решить вашу проблему, хотя на вашем месте я бы просто попытался переписать ее, чтобы она не вызывала эту проблему.

Вы можете протестировать с включенной оптимизацией, выбрав «Редактировать схемы» в раскрывающемся списке схем. Затем установите для параметра «Конфигурация сборки» значение «Выпуск» в файле «Выполнить MyApp.app». Не забудьте снова установить его на отладку, когда вы закончите, так как отладчик несколько сбивается с толку, когда оптимизация включена (т. е. вы не можете видеть значение большинства переменных, некоторые точки останова могут вести себя хаотично и т. д.). )

person Taum    schedule 04.01.2013
comment
Действительно, установка ready на volatile решила проблему. Как мне переписать этот код? Я честно не могу придумать альтернативу. Есть ли у вас какие-либо указания относительно того, что я должен делать? Спасибо вам большое за ответ! - person Frog; 05.01.2013
comment
Это сложно, не зная больше о вашем коде, но обычно NSThread может отправить сообщение из другого потока с помощью performSelector:onThread:withObject:waitUntilDone:. См. stackoverflow.com/questions/2584394/ для примера. Также иногда это так же просто, как использовать два dispatch_async, один для вашего блока потока, а другой, когда это будет сделано! - person Taum; 07.01.2013