2012-01-14 11 views
0

私のアプリケーションは、最も単純な形式で、それぞれが画像を含む10個のUIImageViewsを表示します。すべてのUIImageViewsに画像が含まれていても、私のアプリは十分なメモリフットプリントを使います。ただし、UIImageViewsのすべての画像をnilに設定することで、すべてのUIImageViewをクリアするボタンがあります。問題は、Instrumentsのメモリモニタをチェックするとき、UIImageViewsが保持するメモリがなくなっていないことです。これはAllocations楽器には表示されず、残りのメモリフットプリントがオブジェクトではなくグラフィックスベースのメモリであることが確認されます。イメージのサイズを小さくしたり大きくしたりすると、残っているメモリもそれぞれ小さくなります。UIImageViewはイメージデータを正しく解放していませんか?

なぜUIImageViewの画像がnilに設定された後に画像データが固執するのですか?

答えて

1

私はUIKitが画像のキャッシュを保持して再利用できると考えています。 UIImageViewがオブジェクトを解放している可能性がありますが、パフォーマンスの理由からコピーが保持されます。

これらの画像は、メモリ警告を受け取った時点でリリースされるべきです。そうでない場合は、私が確認する2つの場所があります:

  1. UIImageViewがdeallocされていることを確認してください。 Allocations Instrumentを使用してアプリをプロファイリングし、その画像を読み込むためにプログラムで行う必要があることをすべて実行します。次に、イメージをアンロードし、UIImageViewを検索します。あなたのプログラムがそれらのすべてをリリースしたはずだと確信している限り、あなたが何かを見つけたら、何かが間違っていることを知っています。
  2. また、画像が作成された場所を確認することもできます。例えば、UIImage = [UIImage imageName:@"Foo.jpg"];これらもリリースされていることを確認してください。あなたはUIImageクラスを見つけるために割り当てを使うことができますが、そこにあるべきではないはずのものを除外することは難しくなります。
  3. スタティックアナライザーを実行します。Xcode 4では、[製品] - > [分析]の下にあります。これは、論理エラー、(ARCを使用していない場合)オーバー/アンダーリリースを見つけるための素晴らしいツールです。
+0

理論的にはこのアプリはメモリ警告を受け取ったときに解放されませんか?それは警告にもかかわらず、私のアプリで持続する。 –

+0

はい、メモリの警告を受け取ったときにそれらのキャッシュがクリアされていることがわかりましたので、問題があるようです。私は私の答えを更新します。 –

-1

実際のUIImageViews自体が解放されるまで、それらのメモリは割り当てられたままです。また、あなたはあなたのイメージ、例えば取得するUIImageに便利なメソッドを使用している場合:あなたのイメージは、iOS版で舞台裏をキャッシュして、画像があなたによって解放されているので、場合でも、

UIImage *myImage = [UIImage imageNamed:@"myImage"]; 

注意をメモリフットプリントはまだメモリ内のイメージの存在を反映している可能性があります(最終的にはiOSがそれをリリースするため、リソース消費に悪影響を及ぼすべきではありません)。

+0

私は自分の[UIImage loadImage:]カテゴリメソッドを作成して、キャッシュされているものとそうでないものをよりよく制御できるようにしました。また、ディスクからアプリケーションのバンドルではなく、imageNamed:問題である。また、私がARCにいる場合、これらのオブジェクトを解放する最良の方法は何でしょうか? nilに設定するとメモリが削除されないようです。 –

関連する問題