viewDidUnloadって呼ばれるの?

2つ目のiOSアプリケーション:ストーリーボードを読んでいて以下のような一文を見つけました。

viewDidUnloadメソッドは、ビューに強い参照がある場合に、そのクリーンアップ処理を実装するべき箇所です。
このチュートリアルでは、詳細コントローラのビューが、“Detail View Controllerのヘッダファイルをカスタマイズするには、以下の手順を実行します。”(46ページ)で作成した、sightingプロパティの強い参照を保持しています。viewDidUnloadメソッドを編集して、sightingプロパティに対する強い参照を解除するようにします。

これを見てクリーンアップを実行すべき、というのが分かったのですが。そもそもviewDidUnloadメソッドとは何なのだろうと思いました。

そこで xcode上で Commandキーを押しながら関数名をクリックして宣言を見てみました。すると UIViewController.h が表示されます。

- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); // Called after the view controller's view is released and set to nil. For example, a memory warning which causes the view to be purged. Not invoked as a result of -dealloc.

このコメント部分をみて、ビューがリリースされた後で呼ばれるとありますがそれは何時なのだろうと疑問に思いました。そこで次は、iOS View Controllerプログラミングガイドを見てみました。
viewDidUnloadというキーワードでドキュメント内を検索すると、一件だけ検索結果があります。P68の「メモリが不足しそうなとき、システムがビューをアンロードすることがある(iOS 5以前)」という部分ですが。この部分を読んでみると、どうもアンロードサイクルというものがあるようです。図 4-3 にそれが示されています。viewDidUnload の前に viewWillUnload なんてものもあるんですね。そしてデフォルトで実装されていた didReceiveMemoryWarning も図には記載されています。図のおかけでメソッドの呼ばれるロジックが理解出来ました。

実際によばれるところを確認したいとおもい、新しい Master-Detail Application を作成してみました。DetailViewController.m にメソッドを追加してアプリを実行してみました。

- (void)viewDidUnload
{
    NSLog(@"viewDidUnload");
    [super viewDidUnload];
}

- (void)viewWillUnload
{
    NSLog(@"viewWillUnload");
    [super viewWillUnload];
}

しかし、起動したアプリ内で追加ボタンからの新規データの追加、詳細ページへの遷移、一覧ページでのレコードの削除、などなど色々操作をおこなってみましたが、まったくログが出力されることはありませんでした。結局ビューが削除されるタイミングというのを見ることはできず、残念な結果となってしまいました。何か実装を間違えたのかもしれませんが、、、

ただしチュートリアルに記載されている通り、クリーンアップ処理の実装には気をつけていきたいと思います。