これは複数の部分からなる質問です。主に、この問題に関する私の無知には複数の層があるためです。
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 を として扱い、NSObject
autorelease に設定してから辞書に入れようとしています。私の期待は、これにより、辞書から削除された後に画像をクリーンアップできるようになることです。今、私は疑問を持ち始めています。
ユーザーが「再起動」して別の画像を再生すると、アプリケーションはキャッシュ配列をクリアします。Instruments でアプリケーションを実行すると、再起動時にメモリが「開始」レベルに戻らず、安定したままであることが示されます。私の腸は、配列からすべてのオブジェクトが削除されたときに、CGImageRef
クリアされていないことを教えてくれます。
ただし、楽器のメモリの実際のソースを追跡する方法がよくわからないため、これを確認することはできません. これは (Malloc 16 バイト、Malloc 32 バイトなど) の単なるリストであり、ドリルダウンすると dyld 呼び出し元のリストが表示されます。正しい読み方がわからない。
では、最初の質問は、CGImageRef
オブジェクトをキャッシュする方法に完全な欠陥がありますか? そして、そのようなことを機器で確認するより良い方法はありますか?