2009-08-14 31 views
1

iPhoneアプリケーションのGUIは、多数のUIViewを使用します。ユーザーがボタンをタップして前または後ろに移動すると、これらのビューを「反転」します。ビューはオフスクリーンで保存され、プログラムが表示する必要がある場合にのみ実際のビューに追加されます。メモリリークに関連付けられたUIView

フリッププロセス中、プログラムは親ビュー(uiscrollview)にremoveFromSuperViewメソッドを使用して既存のサブビューを削除するように指示し、新しいサブビューを追加します。これはユーザーが表示する新しいページです。

しかし、デバイス上でこのプロセスが何度か繰り返されると、gdb終了ステータス101でプログラムがクラッシュします。これは、メモリ不足エラーが原因であることがわかりました。

リークツールを使用してこの問題を診断しようとしましたが、役に立たなくなりました。たった1つか2つの小さなメモリリークがあり、プログラムによるデバイス上の総メモリ使用量はわずか2.5 MBです。システムメモリではなくビデオメモリが低速で動作している可能性はありますか?

backgroundColorとmemの使用についてはthis投稿に出ましたが、さらに説明が必要です。 UIViewのCALayerがあまりにも多くのメモリを消費しないように、backgroundColorの設定を減らすべきでしょうか?

答えて

0

これらのビューはすべてどこに保存していますか?具体的には、これらのビューをフリップしたときに表示される配列(NSArray)がありますか?

参照カウントがゼロにならない限り、ビューは割り当て解除されません。あなたの `[[UIView alloc] init]は参照カウントを1にし、サブビューが2になるとそれを追加し、それをサブビューから削除すると再び1になります。あなたが特定のリークを知らされていないのを見て、あなたはどこかにそれを保管することと同じくらい本当に漏れていないようです。

+0

はい、これらのビューをオフスクリーンに保存するためにNSArrayを使用します。合計で、それらはあまりメモリを占有しませんが、メインのScrollViewから定期的にUIViewを追加したり削除したりすると、メモリの問題が発生します。もう1つ注意すべき点は、同じビューインスタンスの2〜3の間を前後に移動すると、何も起こらず、すべて正常に動作するということです。 しかし、10以上のビューを前にたたいていると、プログラムがクラッシュします。私はこの問題をほぼ把握しているように感じます。 – obsoleteModel81

+0

あなたがしていることを正確に知らなくても、言うことは難しいです。したがって、2つのこと: 1.あなたの質問に何をしているかを示すコードを追加してください。 2.私の推測では、オンデマンドでこのエリアにビューを追加しています。以前は見たことがないよりユニークなビューをページすると、ますます多くのメモリが使用されます。次のことを試してください:同じ場所でremoveFromSuperviewを呼び出し、 '[yourArray removeObject:view];も呼び出してください。それがあなたの問題を解決するなら、我々は問題が何であるかを知り、きれいな/適切な解決策を考え出すことができます。 – Itay

+0

表示した後にキャッシュからビューを削除すると、メモリの問題が発生しないようです。まず、レンダリングの前にすべてのビューが初期化されていることに注意することが重要です。ただし、ビューはスクロールビューから削除された後に割り当て解除されるため、メモリの問題はなくなりましたが、プログラムはもうページを戻すことができません。(ページ先送りのみ) ここでは、ビューコンポーネントのリアルタイム初期化が最善の選択ですか、それとも別の解決策がありますか? – obsoleteModel81

1

リンゴのiphoneサンプルコードにアクセスできますか? PageControlサンプルコードプログラムのようなサウンドは、あなたが探しているものの良い例です。サンプルコードプログラムにメモリリークやそのような問題はありません:)リンクhere

ObjectAllocationsをチェックしましたか?私は、漏れツールよりも有用であることを発見しました(オブジェクトの割り当ては、漏れのツールの1つですが)。私は、ビデオメモリが使い果たされた場合、それは別のエラーになると思うだろうが、私は間違っている可能性がある。

+0

きよしは間違いなく正しいアイデアを持ち、正しいリンクを持っています。私が話している技術は、PageControlサンプルで言及されていますが、完全ではありません。未使用のサブビューを削除する必要があります。 – Itay

関連する問題