iOS 6でviewDidUnloadがdeprecatedになりました。もはやメモリ不足の状況になってもViewController#viewが自動的に解放されることはありません。

このドキュメントの「On iOS 6 and Later, a View Controller Unloads Its Own Views When Desired」の項目を参照。

ここに以下のように書かれています(超意訳)。

画面上に描画されているviewはメモリをたくさん消費する可能性がある。ただし、windowにアタッチされなくなったviewのリソース(viewそのものではなく、たぶんその描画に関するもの)を、システムは自動的に解放する。だからほとんどのviewのメモリ消費は十分小さく、システムが自動的にviewそのものを削除したり、再生成する価値はない。

おそらく現行のiPhoneが十分なメモリを搭載するようになったことから、このような結論に至ったのだと思います。3GSくらいまではメモリが少なく、バックグラウンドのアプリからメモリを積極的に解放しないと、フォアグラウンドのアプリに十分なメモリを確保できない状況でした。そこで比較的メモリ浪費が多いであろうviewを強制的に解放する仕組みにしたのだと思います。もしくはiOS 6以前は、windowにアタッチされなくなったviewも描画関係のリソースを保持してしまう仕組みだったのかもしれません。

このviewの強制解放はバグの温床になりました。画面遷移後、前の画面に戻ってきたり、他のアプリから元のアプリに戻ってくると、入力した内容が消える、画面が崩れるといったバグがあったと思います。これはviewDidLoadが複数呼ばれる可能性を考慮せずに、プログラミングしたときに起きうるバグです。viewが強制解放されviewDidUnloadが呼ばれる状況では、再度viewDidLoadが呼ばれることを考慮すべきでした。またそれはすべてのViewControllerが対象でした。これは開発者にとって負担でもありました。

Appleは今となっては十分小さいメモリ消費であるviewを強制解放して、わずかなメモリ確保することよりも、iOSのアプリ全体のバグ発生率を下げることを選択したのだと思います。言い方を変えると、viewが強制解放されるとバグが起きうるアプリも、今は強制解放自体なくなったので、そこでのバグは起きなくなっています。

今、開発者が対処すべきことは、他のアプリを圧迫しそうなくらいメモリを大きく消費する部分を、自主的にメモリ不足時に解放することです。

メモリ不足になると以下のメソッドが呼ばれます。

  • ViewControllerではdidReceiveMemoryWarning
  • ApplicationDelegateではapplicationDidReceiveMemoryWarning:

ViewController単位では、多くの場合、メモリ解放する必要はないかもしれません。どちらかというとApplicationDelegateの方をしっかり実装すべきではないでしょうか。たとえば画像のメモリキャッシュのクリアなどです。小さなメモリ解放を一生懸命頑張ることで、実装コストを増やしたり、コードが複雑化してバグ発生率を上げるようなことは避けたいところです。

また、ドキュメントにはメモリ不足時にviewを解放したい場合は、以下のように対処するように提示されています。

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Add code to clean up any of your own resources that are no longer necessary.
    if ([self.view window] == nil)
    {
        // Add code to preserve data stored in the views that might be
        // needed later.

        // Add code to clean up other strong references to the view in
        // the view hierarchy.
        self.view = nil;
    }

もし、相変わらずviewがメモリ浪費の原因になりうると判断するなら(たとえば大きな画像がたくさん配置されるなど)、このように対処するとよいでしょう。ただ、個人的にはその場合も画像のみを解放するなどで対処したいと思います。やはりviewそのものを解放すると、バグに繋がりやすいと思うので、余程のことがない限りやりたくないです。