私が書いているアプリケーションはiOS5+をサポートする必要があります。ViewDidUnload
最近、メモリ警告のビューを解放してもメモリが大幅に増えることはないと言われているため、Appleは廃止されました。
私のアプリケーションではUIViewController
、非常に重いを管理するがありUIWebView
ます。
このViewControllerはモーダルで表示され、その結果、作成および却下されることがよくあります。
UIWebView
Instrumentsを使用して、コントローラーが閉じられた直後に、によって取得されたメモリが解放されていないことがわかりました。
コントローラーは最終的にMonoGCによって収集されDispose
、コントローラーとそのビューを呼び出して、UIWebView
基になるネイティブオブジェクトを破棄して解放すると想定しました。
これが当てはまるかどうかをテストすることはできません。残念ながら、コントローラーを約10回提示して閉じた後、メモリ警告が表示され、アプリが次の1秒でクラッシュします。MonoGCが実行される機会があるかどうかはわかりません。
だから私がしたのはGC.Collect
、コントローラーが閉じられた直後に呼び出しを追加することでした。
私も追加する必要がありReleaseDesignerOutlets
ましたViewDidDisappear
。
これは解放されているようUIWebView
です。
ReleaseDesignerOutlets
更新:コールインが明らかにWebビューを解放していることはすでにわかりましたがViewDidDisappear
、GCコールにはメリットがありませんでした。実際、ボタンクリックハンドラーがコントローラー全体を存続させていたため、GCがコントローラーを収集することはありませんでした。
今、私はある種の貨物のメモリ管理で完全に迷子になっていると感じています。
- 私の場合、ガベージコレクションを強制するのは合理的ですか?
- なぜ電話しなければならないの
ReleaseDesignerOutlets
ですか?確かに、「デッド」コントローラーへの参照がない場合、そのビューも収集の対象と見なされますか? - Instruments heapshot diffからは、コードから作成されたビューがコントローラーにも「保持」されているように見えます。それらを処分する必要がありますか?それらを無効にしますか?
Dispose
閉じたばかりのコントローラーを手動で呼び出す必要がありますか?- コントローラのメソッドに
ReleaseDesignerOutlets
呼び出しを含める必要がありますか?Dispose
- のカスタム
UIView
サブクラスの子ビューへの参照を無効にする必要がありますDispose
か?