400個のサムネイルを追加するスクロールビューがあります。私はそれを機器でプロファイリングし、メモリのライブバイトが約70MBになるのを観察します。次に、それらすべてをスーパービューから削除すると、ライブバイトは同じままになります。
このメモリを回復する必要があります。トリックは何ですか?
ありがとう。
400個のサムネイルを追加するスクロールビューがあります。私はそれを機器でプロファイリングし、メモリのライブバイトが約70MBになるのを観察します。次に、それらすべてをスーパービューから削除すると、ライブバイトは同じままになります。
このメモリを回復する必要があります。トリックは何ですか?
ありがとう。
管理するものは2つあります-ビューと画像です。スクロールビューの表示部分を埋めるのに十分なスクロールビューサブビューのみが必要です。ここでの良いパターンは、再利用プールを持つことです。スクロールビューのサブビューが必要な場合は、再利用プールでサブビューを確認してください。そこに何もない場合は、1つ割り当てます。スクロールが発生したら、表示されなくなったビューを再利用プールに配置し、新しく表示されたスペースにビューを追加します(最初に再利用プールをチェックします)。
画像は、URLと時間でインデックス付けされたキャッシュに配置できます。可変ディクショナリは、URLインデックスに適しています。URLを含む可変配列は、タイムインデックスの優れたFIFOキューになります。URLは、アプリにパッケージ化された画像のファイルURLか、画像がダウンロードされている場合はリモートURLのいずれかになります。キャッシュに追加するには、URLと画像のペアをディクショナリに追加し、URLを時間配列の先頭(インデックス0)に追加します。
キャッシュに追加するたびに、そのサイズが目標を超えているかどうかを確認してください。削除される場合は、最も古い画像を削除します。これを行うには、配列からlastObjectを取得し、そのurlキーと値のペアをディクショナリから削除し、配列からremoveLastObjectを削除します。
この画像キャッシュは、スクロールビューに表示されるビューの数よりも大きくすることができます。このサイズは、イメージの取得にかかる時間を考慮して、目的のメモリ目標に一致するように調整できます(イメージがリモートの場合は、より大きなキャッシュが必要になる可能性があります)。
スクロールビューに画像サブビューを追加するときは、デフォルトの画像を割り当てます。URLルックアップを使用して、キャッシュされた画像のキャッシュを確認します。そこにある場合は、デフォルトを置き換えます。そうでない場合は、そのイメージの非同期取得を開始します。その画像が到着したら、それをキャッシュに追加し、スクロールビューをチェックして、画像を含むサブビューがまだ表示されているかどうかを確認します(スクロールされていない可能性があります)。そうである場合は、画像を設定します。
データソースから UIImage インスタンスも削除していることを確認してください。また、UIImage を NSCache 内に配置し、メモリが少なくなったときにパージし、UIScrollView の代わりに UITableView を使用することを検討してください (インターフェイス要素を再利用するため)。
これは同様の質問だと思います: UIScrollView 内のかなり大きな画像で UIImageViews によって使用されるメモリの解放に関する問題
以前にも同様の問題がありました。解決策の 1 つは、この質問の回答によると、最終リリースの前に UIImageView イメージを nil に設定することのようです: iPhone でメモリ割り当てエラーを混乱させる