iOS Viewライフサイクルまとめ、iOS6での変更点

TwitterでViewライフサイクルについて話題になったので、まとめてみました。


  1. シングルビューの動作
  2. シングルビュー
    こちらが基本となります。よく勘違いされているのは、ViewDidUnloadは、いつもViewが閉じるときに呼ばれるというものですが、これは間違いで、通常、ViewDidUnloadは呼ばれません。

  3. モーダルビューが呼ばれたとき
  4. モーダルビューが呼ばれたとき
    モーダルビューが呼ばれたときの注意点は、裏にあるビューは、一度UIWindowから削除されて、ViewDidDisappearが走るという点ですね。もちろん、戻るときは、またViewWillAppearが再度呼ばれます。

  5. モーダルビュー表示中にメモリ警告が発生した場合-iOS5以前
  6. モーダルビュー表示中にメモリ警告が起きた場合(iOS5)
    ここで初めて、ViewDidUnloadが呼ばれました。ただ、ここでViewが削除されて、再構成されるため、メモり回りのエラーがよく発生していたと、WWDC2012 – 236のビデオでいっていました。

  7. モーダルビュー表示中にメモリ警告が発生した場合-iOS6以後
  8. モーダルビュー表示中にメモリ警告が発生した場合-iOS6以後
    ViewDidUnloadが非推奨メソッドになって、呼ばれなくなりました。そのかわり、reveivedMemoryWarning関数は引き続き呼ばれているので、そこで必要なメモリの解放を行うことが出来ます。WWDCのビデオで、iOS5でも、ViewDidUnloadを呼ばないと聞いたような気がしたのですが、実際実験してみたところ、iOS5シミュレータでは、ViewDidUnloadは確かに呼ばれていました。

追記: iOS6で、iOS5と同様のビューの解放をする方法


iOS6の場合でも、ビューが多くもメモリを使用している場合、明示的にビューを解放したいときは、下記ようなのコードで行うことが出来ます。photo…の部分は各ビューの状況に合わせて下さい。

追記2: IBOutletなどの解放はどうするか


IBOutletなどの解放はどうするのかという質問があったので、その情報も少し書いておきます。


ここにあるように、ARC以後、IBOutletは、Weakで定義して挙げることにより、心配は無くなります。また、strongで定義していた場合も、そのリリースはdeallocで行われるので、明示的に解放する必要はありません。ARC無しの場合は、解放系は、deallocの中で、releaseを使って行うのがよいと思います。

この流れを理解していると、どのメソッドにどの処理を書くべきかが分かりやすくなると思います。それでも最適な処理を最適な場所に書くのは結構大変ですね。
この動作のためにテストで使用したプロジェクトをここからダウンロードできます。
ViewLivesTestプロジェクト
なにか突っ込みなどありましたら、コメント、Twitterまで教えてください。

「iOS Viewライフサイクルまとめ、iOS6での変更点」への5件のフィードバック

  1. ライフサイクルが変わったと聞いてまとめを探していました。
    とても参考になりました!

    – (void)loadView ; がどうなっているのかも欲しかったです。

    1. テストプロジェクトに、LoadViewの動きもログを出すようにしてみたところ、LoadViewは、iOS5, 6変わらず、常に、ViewDidLoadの前ですね。参考になってよかったです。

  2. 今更ですがちょっと気になったのでコメントします
    if ([self.view window] == nil)
    これだけだと,既に self.view が nil の場合に loadView: が走るので,
    if ([self isViewLoaded] && [self.view window] == nil)
    とした方が良いと思います

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください