2

私のアプリでは、この行を使用しました

[UIImage imageNamed:imageName] 

画像をロードするときはいつでも。私が理解しているように、この関数は後で使用するために画像をキャッシュします-ほとんどの画像は複数回使用されるため、これは素晴らしいことです。

しかし、メモリ警告をシミュレートすると、これらの画像で使用されているメモリはそれに応じて解放されていないようです-メモリのほとんどは実際にはキャッシュされた画像で使用されているため、現在不要な画像を解放することが非常に重要です記憶から!

-

これは予想される動作ですか、それともシミュレートされたメモリ警告にすぎないために画像がメモリに残っていますか?または、これらの画像をリリースしたい場合は、画像をキャッシュするが、メモリが不足しているときに不要な画像をリリースするUIImageの独自のカテゴリを作成する必要があります(または、さらに良いことに、誰かがすでにこれを行っているか、コードを共有しています) ??

4

3 に答える 3

4

私が行ったことは、キャッシュを使用しない独自のキャッシュメカニズムを作成することです。保存-initWithConentsOfFileするために、割り当てられたすべての画像は、画像名をキーとしてディクショナリに保存されます。NSMutableDictionaryメモリ警告に達した場合は、ディクショナリを解放および nil して、イメージから割り当てられたすべてのメモリを解放できます。

これにより、画像のキャッシュを完全に制御できます。-imageNamed:は、割り当てられたメモリがいつどこで解放されるかを制御できない独自のキャッシュ メカニズムを使用します。

この方法も試してみてください。

編集:私のUIImageクラス拡張( https://gist.github.com/2880240-imageNamed: )は、メモリ警告を受け取ったときにカスタムキャッシュでオーバーライドし、単に使用できます[UIImage freeCache]。また、すべての画像をキャッシュに保存する際に自動解放を設定する機能も含まれています[UIImage setShouldAutorelease:TRUE]。デフォルトでは FALSE です。

試してみてください。

于 2012-06-06T00:40:39.743 に答える
0

クリーンアップする必要のあるイメージへの参照がなくなった場合でも、内部キャッシュメカニズムについて心配する必要はありません(その動作はとにかく文書化されていないため)。画像への参照(nilまたはrelease)を削除するためのコードはありますか?

于 2012-06-05T23:43:22.417 に答える
0

UIImageViewで使用していますか?

多くのフレームワークデータは、アプリがバックグラウンドに移行することで自動的に管理されます。imageNamed:でロードされた画像のデータは自動的に破棄されますが、UIImageViewはそのデータを破棄しないため、メモリ不足の警告と同じである可能性があります。

PSアプリが一時停止されている場合、メモリ警告は表示されません。また、大量のメモリを使用している場合は、おそらく終了します。この可能性を減らすために(重要な場合)、NSCacheに格納するNSPurgeableDataを使用して、メモリ不足の状況が発生した場合にパージ可能としてフラグを立てることができます。その後、OSがそれをパージします。

于 2012-06-05T23:43:38.273 に答える