0

400個のサムネイルを追加するスクロールビューがあります。私はそれを機器でプロファイリングし、メモリのライブバイトが約70MBになるのを観察します。次に、それらすべてをスーパービューから削除すると、ライブバイトは同じままになります。

このメモリを回復する必要があります。トリックは何ですか?

ありがとう。

4

3 に答える 3

0

管理するものは2つあります-ビューと画像です。スクロールビューの表示部分を埋めるのに十分なスクロールビューサブビューのみが必要です。ここでの良いパターンは、再利用プールを持つことです。スクロールビューのサブビューが必要な場合は、再利用プールでサブビューを確認してください。そこに何もない場合は、1つ割り当てます。スクロールが発生したら、表示されなくなったビューを再利用プールに配置し、新しく表示されたスペースにビューを追加します(最初に再利用プールをチェックします)。

画像は、URLと時間でインデックス付けされたキャッシュに配置できます。可変ディクショナリは、URLインデックスに適しています。URLを含む可変配列は、タイムインデックスの優れたFIFOキューになります。URLは、アプリにパッケージ化された画像のファイルURLか、画像がダウンロードされている場合はリモートURLのいずれかになります。キャッシュに追加するには、URLと画像のペアをディクショナリに追加し、URLを時間配列の先頭(インデックス0)に追加します。

キャッシュに追加するたびに、そのサイズが目標を超えているかどうかを確認してください。削除される場合は、最も古い画像を削除します。これを行うには、配列からlastObjectを取得し、そのurlキーと値のペアをディクショナリから削除し、配列からremoveLastObjectを削除します。

この画像キャッシュは、スクロールビューに表示されるビューの数よりも大きくすることができます。このサイズは、イメージの取得にかかる時間を考慮して、目的のメモリ目標に一致するように調整できます(イメージがリモートの場合は、より大きなキャッシュが必要になる可能性があります)。

スクロールビューに画像サブビューを追加するときは、デフォルトの画像を割り当てます。URLルックアップを使用して、キャッシュされた画像のキャッシュを確認します。そこにある場合は、デフォルトを置き換えます。そうでない場合は、そのイメージの非同期取得を開始します。その画像が到着したら、それをキャッシュに追加し、スクロールビューをチェックして、画像を含むサブビューがまだ表示されているかどうかを確認します(スクロールされていない可能性があります)。そうである場合は、画像を設定します。

于 2012-09-11T23:20:22.670 に答える
0

データソースから UIImage インスタンスも削除していることを確認してください。また、UIImage を NSCache 内に配置し、メモリが少なくなったときにパージし、UIScrollView の代わりに UITableView を使用することを検討してください (インターフェイス要素を再利用するため)。

于 2012-09-11T22:31:18.103 に答える
0

これは同様の質問だと思います: UIScrollView 内のかなり大きな画像で UIImageViews によって使用されるメモリの解放に関する問題

以前にも同様の問題がありました。解決策の 1 つは、この質問の回答によると、最終リリースの前に UIImageView イメージを nil に設定することのようです: iPhone でメモリ割り当てエラーを混乱させる

于 2012-09-11T22:26:57.930 に答える