2

これは複数の部分からなる質問です。主に、この問題に関する私の無知には複数の層があるためです。

CGImageRefまず、オブジェクトをキャッシュするためのキャッシュ システムをまとめました。バックグラウンドスレッドで画像をロードしているので、 CGImageRef(ではなく)レベルに保ちます。UIImage画像が読み込まれると、NSMutableDictionary. CGImageRefを配列に入れるには、少し腕をひねる必要がありました。

//Bunch of stuff drawing into a context
CGImageRef imageRef = CGBitmapContextCreateImage(context);

CGContextRelease(context); 
[(id)imageRef autorelease];
[self.cache setObject:(id)imageRef forKey:@"SomeKey"];

ご覧のとおり、Image Ref を として扱い、NSObjectautorelease に設定してから辞書に入れようとしています。私の期待は、これにより、辞書から削除された後に画像をクリーンアップできるようになることです。今、私は疑問を持ち始めています。

ユーザーが「再起動」して別の画像を再生すると、アプリケーションはキャッシュ配列をクリアします。Instruments でアプリケーションを実行すると、再起動時にメモリが「開始」レベルに戻らず、安定したままであることが示されます。私の腸は、配列からすべてのオブジェクトが削除されたときに、CGImageRefクリアされていないことを教えてくれます。

ただし、楽器のメモリの実際のソースを追跡する方法がよくわからないため、これを確認することはできません. これは (Malloc 16 バイト、Malloc 32 バイトなど) の単なるリストであり、ドリルダウンすると dyld 呼び出し元のリストが表示されます。正しい読み方がわからない。

では、最初の質問は、CGImageRefオブジェクトをキャッシュする方法に完全な欠陥がありますか? そして、そのようなことを機器で確認するより良い方法はありますか?

4

2 に答える 2

1

まず、CGImages のキャッシュは問題なく、投稿したコードに問題はありません。

NSMutableDictionaryをキャッシュとして使用していると思いますか? その場合は、それを送信してクリアできます。これにより-removeAllObjects、すべてのキーと値が解放されます。同じキーに異なるイメージを設定した場合、以前のイメージを新しいイメージに置き換えるため、メモリ使用量はほぼ同じままになる可能性があります。画像が同じサイズの場合、画像の新しいバッチを作成するときの短いスパイクを除いて、メモリ使用量は一定である必要があります。

Instrumentsに関しては、偽陽性を報告し、実際のリークを見逃すことの両方を見てきました. Leaks 装置が「追いつく」ために、可能であれば一時停止して、数回実行してみてください。これはクレイジーに聞こえるかもしれませんが、もう少し信頼できると思います。

他のすべてが失敗した場合は、一連の画像をロードする前後にキャッシュの内容をログに記録して、キャッシュ自体が期待どおりに機能することを確認できます。

于 2010-12-20T16:22:05.493 に答える
0

UIImageオブジェクトをキャッシュしないのはなぜですか。あなたはそれらをバックグラウンドスレッドでうまく作ることができますか?

注意が必要なのはUIImageViewオブジェクトであり、バックグラウンドでのほとんどの操作でも問題ありません。

于 2010-12-20T15:49:08.060 に答える