viewLoadedとメモリ不足

開発していて、viewLoadedが何度も呼ばれてしまうという現象に出会いました。

あるview AをUINavigationViewで表示 → view Bをpush -> view Bをpopしてview Aに戻る

ところで、view AのviewLoadedが再度呼ばれる。本来ならview Aが最初に表示されたときに呼ばれるはず...おかしいなぁとおもっていろいろやっていたんですが、その鍵は

didReceiveMemoryWarning

にありました。

UIViewControllerは、didReceiveMemoryWarning(つまりメモリが少ない!という警告)をうけとったら、superviewのないviewをリリースするという実装になっています。上の例で、view Bを表示するときにメモリ不足に陥り、didReceiveMemoryWarningが呼ばれていたようです。didReceiveMemoryWarning はデフォルトのままになっていたんですが、そうすると隠れているview Aはsuperviewがないためリリースされます。view Bをpopしてview Aに戻ったときに、再度view Aがロードされ、viewLoadedが呼ばれる。こういうことだったんですね。

viewLoadedに種々の初期化の手続きを書くのが好きな人は注意しましょう。
これは自分に対するメモとして書いておきます。