2010-11-25 6 views
2

私はUIScrollViewを使って検索基準に基づいて画像のリストを表示するアプリケーションを開発しています。ボタンを使用すると、ユーザーはさらに画像を読み込むことができます。iPhoneのメモリ管理で、複数のデバイスでクラッシュする可能性があります

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

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

私はdidReceiveMemoryWarningを実装し、基本的にすべてのオブジェクトを解放しました。楽器では、メモリ使用量が〜3MBに低下します。 iPodが初めてメモリの上限に達すると、メモリが解放され、アプリは通常の操作を再開します。しかし、didReceiveMemoryWarningが呼び出されたときに2回目に、オブジェクトが解放されたことがわかりましたが、とにかくアプリがクラッシュします。

どうすれば私のアプリクラッシュプルーフを作成できますか?私は、アプリケーションを実行するすべてのデバイスがメモリが許す限り多くのイメージを読み込むことができるようにしたいが、私はまた、アプリケーションがクラッシュしないようにしたい。

私はアプリがdidReceiveMemoryWarningに到達しないようにして、表示できる画像の数に制限を設けたいと考えていますが、どのように多くの画像を読み込めるのかはどうすれば分かりますか?

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

訴訟はありますか?

答えて

1

まず、すべての画像を一度に表示したくない場合があります。むしろ、現在表示されている画像だけを無効にしたいだけでなく、ユーザーがその場所にスクロールしたときに画面にプリロードされていない画像を無効にしたい場合もあります。

これは、写真アプリの動作とほとんど同じです(UITableViewの実装方法)。基本的には次のようになります。

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

ユーザーがスクロールビューをスクロールすると、まず、スクロールビューに、新しいセルをデキューするように依頼します。これは、表ビューで使用するためにセルをデキューするように要求するのと同じです。これにより、リサイクルされている場合、割当のコストが節約されます。あなたがリサイクルされたセットからデキューできない場合は、あなたがしなければならないことは非常に単純です:あなたが現在行っているものと同じものを割り当てます。

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

これを実行すると、必要なときにのみセルをセットアップする必要があります。これは、この動作のもう1つの重要な側面です。

最後に、メモリ警告が表示されたら、リサイクルされたセルセットを削除してください。これが問題になるほどの高さになると、つまり、数メガバイトのメモリを節約します。 :)(画面上に表示されていないセルは、キャッシュのように、これの良い例です)。

0

画像を遅延ロードして、その時に必要な画像のみを読み込む必要があります。あなたのアプリは一画面にすべての画像を表示することはできません。そのため、スクロールビューでは、画面に収まる画像やそれ以外の画像をロードし、不要な画像をスクロールして解放する必要があります。

関連する問題