2012/10/30

iOS 6における低メモリ警告とその処理について

iOS 6からviewWillUnloadviewDidUnloadが呼ばれなくなったようなので、実際どのように処理をしているのかを調べてみました。

詳細は「View Controller Programming Guide for iOS」の「Resource Management in View Controllers」を参照してください。

iOS 6からビューコントローラのビュー関連は次のように変わりました。

  • コントローラのviewプロパティは一度作られたらコントローラが破棄されるまで持ち続けるようになった
    • オンスクリーン描画用のメモリは大きいので、ウィンドウからデタッチされたら (不要になったら) システムが自動的に破棄する
    • ほとんどのコントローラでは、他で使うメモリは小さいはずなのでシステムは気にしないようになった
  • 必要なら、ビュー階層を明示的に破棄することができる。

というわけで、ビューのロード状態の遷移図は上の図のようになります。 (PDF)

「Unloaded」や「Loaded」は丸四角はビューの状態を示しており、Unloadedはコントローラのviewがnilの状態、Loadedはコントローラのviewがnilでない状態、「Released」はコントローラ自体が破棄された状態です。

青丸とその側のタイプライタフォントで書かれた文字は呼び出されるメソッドを示しており、赤い文がそのメソッドにおける注意点など、青い文がその矢印のトリガとなる条件を示しています。

Unloadは明示的に行わなければ行けないので点線にしています。 大体のことはOS任せになり、iOS 4のときと比べるとかなりシンプルになりました。

また、didReceiveMemoryWarningは次のように書くべきのようです。

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    // 必要なくなったリソースのクリーンアップコードを書く

    if ([self.view window] == nil) { // オフスクリーン
        // 後で必要になる (かもしれない) データを保存するコードを書く

        // ビューへの強参照を開放するコードを書く     

        self.view = nil;
    }
}

関連項目

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。