0

アプリケーションのスレッドに次のコードがあります。

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

ready 変数はデリゲート メソッドから変更されます。このコードは、Xcode のツールバーの [実行] ボタンをクリックしてアプリケーションを開くとうまく機能します。ただし、このアプリケーションの .app ([製品] > [アーカイブ] をクリックし、手順に従って作成したもの) を開くと、このコードが機能しなくなります。

progressIndicatorController.valueはインクリメントされることはなく、この if ステートメントは に評価されることはありませんtrue。この問題の原因は何ですか?

4

1 に答える 1

1

これはおそらくコンパイラからの最適化が原因です。

アーカイブを使用してビルドする場合、XCodeはコンパイラーで最適化を有効にし、この種のコードを破棄する可能性があります。準備完了変数をvolatileに設定すると、問題が解決する可能性があると思いますが、私があなたである場合は、この問題が発生しないように書き直そうとします。

[スキーム]ドロップダウンで[スキームの編集]を選択すると、最適化をオンにしてテストできます。次に、RunMyApp.appでBuildConfigurationをReleaseに設定します。ただし、最適化がオンになっているとデバッガーが多少混乱するため、完了したらデバッグに戻すことを忘れないでください(つまり、ほとんどの変数の値が表示されない、一部のブレークポイントが不規則に動作する可能性があります... )。

于 2013-01-04T21:39:24.897 に答える