ループの奇妙な点:デバッグでは機能しますが、リリースでは機能しません

良い一日、habrayuzery。



長い間、私は何も書いていませんでしたが、ここでは単なる露骨なケースです。 私は最近Objective-Cで書きました;私は1日か2日のための出口を探すことができる多くの多くの奇妙な状況に遭遇しました。 その結果、すべてが決定され、平凡でシンプルであることが判明しました。 さらに、「これはすべてシンプソンズに既にありました」-問題がローカライズされた後、その解決策はGoogleの最初のページにありました。



しかし、ここに! アプリケーションをデバッグし、AppStoreのアーカイブに入れて、デバイスを再確認することにしました-バグが入りました。



何が起こり、どのように対処するか-以下で議論することを提案します





だから、私のプログラムは次のことをしました:

メインスレッド(以降、簡単にするため、スレッドスレッドと呼びます)には、画像、テキスト、オーディオ、ビデオがレンダリングされるグローバルUIScrollViewが表示されます。 現在開いているページの場合、レンダリングは同じメインストリームで実行されます。 隣接するページへのスムーズな移行のために、個別に作成されたストリームで、予備レンダリングが実行され(低解像度の写真が画面に引き伸ばされます)、完全なレンダリングが実行されます。 予備レンダリングでストリームを1番目のストリーム、1番目の完全なストリーム、2番目のストリームと呼びます。



なぜ事前レンダリングが必要なのですか? これにより、ユーザーはページをすばやくすばやくめくって低品質のページを表示でき、毎回完全版をダウンロードするのを待つ必要がなくなります。

完全なレンダリングは理解できます。 人が1つのページを読み、次のページに移動します。すべてのページが既に読み込まれ、「新しい」隣接ページがキューに追加されます。



ところで、2つのストリームから1ページを同時にレンダリングすることは不可能です。したがって、ストリーム1とストリーム2は、だれかが現在のページのレンダリングを完了するのを待ってから、予備/完全レンダリングがあるかどうかをチェックしました。これに応じて、計画が実行された、または彼らは去った。

このすべてのために、BOOL isRenderingフラグが使用されました。 そして、メソッド-(void)preRenderPageおよび-(void)fullRenderPageには、次のような構造がありました。



while(!isRendering){

}

isRendering = YES;



... //直接レンダリング



isRendering = NO;

帰る



Xcodeから起動するときはすべて正常に動作しましたが、アーカイブ/リリースビルドを起動するときは動作しなくなりました。

問題を特定するのに1営業日かかりましたが、それ以降は言及していませんでした。 とても注意!

待機ループを次のように変更した場合:

while(!isRendering){

[NSThread sleepForTimeInterval:0.01];

}

その後、開発ビルドのように、すべてが再び機能します。



whileループが限られた回数しか実行できないバージョンしかありません。 Xcodeから起動すると、各命令の後、プログラムは開発環境と通信するため、動作が遅くなります。 リリースバージョンを起動すると、そのような遅延はなく、whileループは何度も実行され、強制終了されます。 中断状態で中断され、実行されなくなります。



これらは物です。



おそらく、原則として、私は有効化フラグの期待をひそかに実感し、それを別の方法で行う価値がありました。 私の目を開けてください:)たぶんもっと一般的でシンプルなものがあります。



NSRunLoopおよび[NSDate distantFuture]を使用したPSオプションは考慮されませんでした。 コマンドがない場合は、一度だけ実行されます。 [NSDate dateWithTimeIntervalSinceNow:0.01]-私の意見では、私のソリューションと何ら違いはなく、さらに面倒です。



All Articles