Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2009-09-06

メモリ不足時に呼ばれるメソッドとその順番

08:43 | はてなブックマーク - メモリ不足時に呼ばれるメソッドとその順番 - iPhoneアプリ開発まっしぐら★

メモリ不足時にdidReceiveMemoryWarningメソッドが呼ばれることはよく知られているが、OS 3.0以降では、viewDidUnloadメソッドも呼ばれるようになった。

それでは、UINavigationControllerを使って複数の画面がメモリ上に存在している場合、それぞれの画面に対してこれらのメソッドがどのような順番で呼ばれるだろうか。

実験した結果を図にまとめる。

f:id:tokorom:20090906084341p:image


重要なのは、

・didReceiveMemoryWarningメソッドは、すべての画面に対して呼ばれる

・viewDidUnloadメソッドは、裏にある画面に対してのみ呼ばれる

ということだろう。

要するに、メモリ不足時にUnloadされる画面にのみviewDidUnloadメソッドが呼ばれるということだ。

つまり、viewDidLoadメソッドで確保したメモリを解放する場合には、viewDidUnloadメソッドでその処置をしたほうが良い。

didReceiveMemoryWarningメソッドでは、それではまかなえきれないメモリ不足への対処、また、一番表にある画面に対しても行うべき対処を実装する場合に利用するのが良いだろう。

※2009/12/21 追記

Interface Builder (nibファイル)を使わない状態で

viewDidUnloadメソッド

が呼ばれる条件を整理しておく(いろいろと確認中)。

iPhone OS 3.1.2で確認。

(1) UIViewControllerのloadViewメソッドをオーバーライドする

- (void)loadView {
  [super loadView];
}

(2) didReceiveMemoryWarningをオーバーライドする場合には、必ず親クラスのdidReceiveMemoryWarningも呼ぶ

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
}

ゲスト



トラックバック - http://iphone-dev.g.hatena.ne.jp/tokorom/20090906