2

UIScrollViewを使用して、検索条件に基づいて画像のリストを表示するアプリを開発しています。ボタンを使用すると、ユーザーはより多くの画像を読み込むことができます。

iPhone 4でテストすると、ViewControllerは最大750枚の画像でメモリ警告を受け取ります。iPodの第2世代でテストすると、約150枚の画像でメモリ警告が表示されます。

私の理解では、didReceiveMemoryWarningが呼び出されると、オブジェクトを解放することでメモリを解放できますが、メモリ不足からの回復は保証されません。

didReceiveMemoryWarningを実装し、基本的にすべてのオブジェクトをリリースしました。機器では、メモリ使用量が約3MBに低下します。iPodが初めてメモリ制限に達すると、すべてがうまくいき、メモリが解放され、アプリは通常の動作を再開します。ただし、2回目にdidReceiveMemoryWarningを呼び出すと、解放されたオブジェクトを確認できますが、とにかくアプリがクラッシュします。

では、どうすればアプリをクラッシュプルーフにすることができますか?アプリを実行しているすべてのデバイスがメモリが許す限り多くの画像をロードできることを確認したいのですが、アプリがクラッシュしないことも確認したいと思います。

アプリがdidReceiveMemoryWarningに到達せず、表示できる画像の数に制限を設定したいのですが、各デバイスがロードできる画像の数をどのように決定できますか?

また、画像のサイズは保証されません。テスト中に、iPodでこの任意の数の150に到達しましたが、ある時点でサーバー上の画像が2倍の大きさである場合はどうなりますか?その場合、アプリはおそらく75枚の画像でクラッシュします。

何か疑惑はありますか?

4

2 に答える 2

1

まず、おそらくやりたいことは、すべての画像を一度に表示することではありません。むしろ、現在表示されている画像に加えて、ユーザーがその場所にスクロールしたときに画面外にプリロードされている画像のみを無効にしたい場合があります。

これは、写真アプリの動作とほとんど同じ方法で、UITableView実装方法です。基本的にそれはこれに要約されます:

メインのスクロールビューがあり、その中に個々のセルがあります。これらのセルは、特定のオフセットでスクロールビューにサブビューとして追加される小さなビューです。次に、これらのセルに画像を追加します。

ユーザーがscrollviewをスクロールするときは、最初にscrollviewに新しいセルのキューを削除するように要求します。これは、テーブルビューにセルのキューを削除するように要求するのとほぼ同じ方法です。これにより、リサイクルされた場合の割り当てのコストが節約されます。リサイクルされたセットから1つをデキューできない場合は、非常に簡単です。現在行っているように1つを割り当てます。

さらに、このセルのリサイクルを実装するには、どのセルが画面に表示されているかを確認する必要があります。1つまたは複数のセルが画面から消えた場合は、作成したリサイクルセルにそれらを追加しNSSetます。このセットは、後でリサイクルするためにセルを保持するだけです。これを実証するAppleのサンプルコードがいくつかあり、PhotoScrollerと呼ばれています。また、WWDC10ビデオのセッション104でも紹介されています。ぜひご覧ください。タイリングに関する部分は無視してください。目的のためにそれを知る必要はありません。

これを配置すると、必要な場合にのみセルを設定するように強制されます。これは、この動作のもう1つの重要な側面でもあります。

最後に、メモリ警告を受け取ったら、リサイクルセルセットをドロップするだけです。これが重要になるほど高くなった場合、つまり、数メガのメモリを節約できます。:)(ただし、特に必要のない一時データを保持する場合は、実装することを忘れないでください...画面に表示されないセルは、キャッシュと同様に、この良い例です。)

于 2010-11-25T14:36:31.497 に答える
0

画像を遅延読み込みし、その時点で必要な画像のみを読み込む必要があります。アプリはとにかくこれらすべての画像を1つの画面に表示することはできないため、スクロールビューでは、画面に収まる画像とその周囲のいくつかの画像のみを読み込む必要があります。ユーザーがスクロールして画像を解放すると、不要になります。 。

于 2010-11-25T14:35:41.450 に答える