iPhoneアプリケーションのGUIは、多数のUIViewを使用します。ユーザーがボタンをタップして前または後ろに移動すると、これらのビューを「反転」します。ビューはオフスクリーンで保存され、プログラムが表示する必要がある場合にのみ実際のビューに追加されます。メモリリークに関連付けられたUIView
フリッププロセス中、プログラムは親ビュー(uiscrollview)にremoveFromSuperViewメソッドを使用して既存のサブビューを削除するように指示し、新しいサブビューを追加します。これはユーザーが表示する新しいページです。
しかし、デバイス上でこのプロセスが何度か繰り返されると、gdb終了ステータス101でプログラムがクラッシュします。これは、メモリ不足エラーが原因であることがわかりました。
リークツールを使用してこの問題を診断しようとしましたが、役に立たなくなりました。たった1つか2つの小さなメモリリークがあり、プログラムによるデバイス上の総メモリ使用量はわずか2.5 MBです。システムメモリではなくビデオメモリが低速で動作している可能性はありますか?
backgroundColorとmemの使用についてはthis投稿に出ましたが、さらに説明が必要です。 UIViewのCALayerがあまりにも多くのメモリを消費しないように、backgroundColorの設定を減らすべきでしょうか?
はい、これらのビューをオフスクリーンに保存するためにNSArrayを使用します。合計で、それらはあまりメモリを占有しませんが、メインのScrollViewから定期的にUIViewを追加したり削除したりすると、メモリの問題が発生します。もう1つ注意すべき点は、同じビューインスタンスの2〜3の間を前後に移動すると、何も起こらず、すべて正常に動作するということです。 しかし、10以上のビューを前にたたいていると、プログラムがクラッシュします。私はこの問題をほぼ把握しているように感じます。 – obsoleteModel81
あなたがしていることを正確に知らなくても、言うことは難しいです。したがって、2つのこと: 1.あなたの質問に何をしているかを示すコードを追加してください。 2.私の推測では、オンデマンドでこのエリアにビューを追加しています。以前は見たことがないよりユニークなビューをページすると、ますます多くのメモリが使用されます。次のことを試してください:同じ場所でremoveFromSuperviewを呼び出し、 '[yourArray removeObject:view];も呼び出してください。それがあなたの問題を解決するなら、我々は問題が何であるかを知り、きれいな/適切な解決策を考え出すことができます。 – Itay
表示した後にキャッシュからビューを削除すると、メモリの問題が発生しないようです。まず、レンダリングの前にすべてのビューが初期化されていることに注意することが重要です。ただし、ビューはスクロールビューから削除された後に割り当て解除されるため、メモリの問題はなくなりましたが、プログラムはもうページを戻すことができません。(ページ先送りのみ) ここでは、ビューコンポーネントのリアルタイム初期化が最善の選択ですか、それとも別の解決策がありますか? – obsoleteModel81