10

UIImagePNGRepresentation() が時々 png_error 呼び出しを引き起こす奇妙なクラッシュが発生しています。社内のどのデバイスでもこのエラーを再現できませんでした。

以下は、HockeyApp クラッシュ ログの 1 つからのスタック トレースの例です。

Thread 0 Crashed:
0   libsystem_kernel.dylib         0x3167132c __pthread_kill + 8
1   libsystem_c.dylib              0x33d6729f abort + 94
2   ImageIO                        0x346c38bf png_error + 114
3   ImageIO                        0x346c2fe3 png_write_end + 46
4   ImageIO                        0x346bf069 writeOnePng + 2260
5   ImageIO                        0x346be78b _CGImagePluginWritePNG + 82
6   ImageIO                        0x346be6fd CGImageDestinationFinalize + 132
7   UIKit                          0x31346e23 UIImagePNGRepresentation + 274

このクラッシュ ログは、iOS 5.1 以降を実行しているデバイスでのみ確認されています。実際、iOS 6 からもクラッシュが発生しているため、このバグはまだ修正されていません。

アプリで表示できる 16,000 を超える画像をダウンロードするテスト アプリを作成しましたが、それらすべてを問題なくダウンロードしてディスクに保存することができました。この要旨へのいくつかの回答は、この問題が破損した画像によって引き起こされた可能性があることを示唆していますが、16,000 を超える画像をダウンロードし、一度も問題が発生したことがないことを考えると、これは事実ではないと思います.

私が取り組んでいる最新の仮説は、ダウンロード中のデータが何らかの形で破損しているため、破損した UIImage が作成されているというものです。ただし、破損した UIImage を作成する試みはすべて失敗しました。Apple は UIImage の堅牢なコンストラクターを作成したようで、渡したものは無効であり、コンストラクターから nil が返されます。

他の誰かが UIImagePNGRepresentation からこのようなことを経験しましたか?

4

5 に答える 5

0

私は実稼働アプリ (UIImageJPEGRepresentation()私の場合は使用) で数か月間、同様のローカル イメージの破損の問題に取り組んできました。

私の場合、エラーの実際のユーザーへの影響は、画像が部分的にしかレンダリングされないことでした。画像の残りの部分は単に灰色で破損しているように見えます。Core Data を使用してディスクの保存と読み取りを行っています (ただし、Core Data は驚くべきことに私の問題ではありませんでした)。

私の修正:

以前はこの便利な方法を使用していました:

UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

..しかし、ここにある他の関連記事のアドバイスに従って、代わりにこの方法の組み合わせに切り替えました。

NSData *resultData = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:resultData];

..そして、私の問題を解決したようです!

私の理論

imageWithContentsOfFile:何らかの理由で、純粋なベース呼び出しと比較して、いくつかの非原子的なエッジケース条件の処理が悪く、何らかの理由でNSData、前の「書き込み」が完了する前に「読み取り」を開始できるようになっていると思います。

お役に立てれば!幸運を。

于 2012-12-25T09:46:18.380 に答える
0

さまざまなネットワーク条件でテストを試みましたか? Wi-Fiだけでなく、3Gまたはエッジ?Network Link Conditionerを使用して、低速で損失の多いネットワークのこれらの条件をシミュレートしてみてください。

于 2012-09-17T15:44:04.133 に答える
0

セカンダリ スレッドから UIKit 呼び出しを行っていますか? セカンダリ スレッドでの UIKit グラフィック呼び出しが機能しているが、後でメイン スレッドがクラッシュするクラッシュを見たことがあります。セカンダリ スレッドで使用できる UIKit メソッドがいくつかありますが、多くはありません。

于 2012-09-20T03:27:21.650 に答える