UIViewController の viewライフサイクル についてのメモ

なんかすぐに忘れるのでメモ
もとネタはAppleさんのReferenceとか

間違ってたらコメントくだしあ


didReceiveMemoryWarning

アプリがメモリ不足の警告を受けとった時に呼ばれる。


デフォルトの実装ではまずviewを安全に開放できるかどうかをチェックします。
安全に開放できるというのは、viewが親view(スーパービュー)を持っていない状態で、nibファイルまたはloadViewメソッドで再読み込みできる状態です。
viewを安全に開放できる事が確認できたらviewを開放してviewDidUnloadメソッドを呼びます。


view controllerで使っている他のメモリ領域も開放したい場合はこのメソッドをオーバーライドして開放できます。
その場合はオーバーライドしたメソッドの中のviewを開放したい時点でsuperを呼んでください。


iOS 3.0移行ではview controllerがview階層内のオブジェクト参照を持っていたら、その参照をviewDidUnloadメソッドで開放する必要があり、それより前のiOSではこのメソッド内で開放する必要があります。


アウトレットとその他のオブジェクトを安全に開放する方法はviewDidUnloadメソッドの説明を参照。


initWithNibName:bundle:

指定されたバンドルのnibファイルをもとにview controlerを初期化する。


これがUIViewControllerの指定イニシャライザです。

指定したnibファイルはすぐに読み込まれるわではなく、初めてview controllerのviewプロパティにアクセスした時に読み込まれます。
もしnibファイルが読み込まれた時に何か追加の初期化を行いたい時はviewDidLoadメソッドをオーバーライドしてやりたい事をそこで実効させます。


nibNameにnilを指定する場合はloadViewメソッドをオーバーライドしてviewを作成するか、view controllerクラスの名前と一致するnibファイルを作成してバンドル内に置いておく必要があります。(後者の場合は nibName プロパティにクラス名が保存されます)
もしどちらの対応もとらなかった場合はview controllerはviewを読み込む事ができません。


view controllerがviewを読み込む際のさらに詳しい情報は View Controller Programming Guide for iOS の "Custom View Controllers" を参照してください。


loadView

controllerが制御するviewを作成する。


このメソッドは直接呼んではいけない。
viewプロパティがnilに時にviewプロパティを読もうとするとview controllerが、このメソッドを呼ぶ。


viewを手動で作成したい時にはこのメソッドをオーバーライドしてお好みのviewを作成する。
Interface Builder上でviewを作ってview controllerを初期化する時、つまりinitWithNibName:bundle:メソッドでnibNameとnibBundleプロパティを直接指定してそのviewを初期化した場合や、Interface Builderでviewとview controllerを両方作った場合はこのメソッドをオーバーライドする必要はない。


デフォルトの実装では有効なnibの情報を探し、その情報をもとに関連付けられたnibファイルをloadします。
もしnibの情報が指定されていなかったら、デフォルトでは素のUIViewオブジェクトを作成しmain viewとします。


このメソッドをオーバーライドしてviewを手動で作成する時は、作成したview階層のroot viewをviewプロパティにセットするようにしてください。(作成したviewは一意なインスタンスある必要があり、他のview controllerオブジェクトと共有しているものであってはいけません)
なおこのメソッドの個別の実装の中で super を呼んではいけません。


viewを作成する以外の追加の初期化をしたい場合はviewDidLoadメソッドの中で実行します。
iOS 3.0以降だったら viewDidUnload メソッドもオーバーライドして view や他のコンテンツの参照を開放する必要もあります。


viewDidAppear:

view controllerのviewがwindowに追加されたらview controllerに通知される


viewが表示される動作に関連付けて何かやりたい事があればこのメソッドをオーバーライドする。
もしオーバーライドするなら、実装の中のどこかでsuperを呼んでね。


viewDidDisappear:

view controllerのviewが破棄されたり覆われたりした場合や、その他の方法で非表示になったらview controllerに通知される


viewが破棄されたり非表示になる動作に関連付けて何かやりたい事があったらこのメソッドをオーバーライドする。
もしオーバーライドするなら、実装の中のどこかでviewDidDisappearを呼んでね。


viewDidLoad

view controllerのviewがメモリに読み込まれた後に呼ばれる。


このメソッドはview controllerが関連付けられたviewをメモリに読み込んだ後に呼ばれる。
ちなみにこのメソッドはviewがnibファイルから読み込まれたかloadViewメソッドで作られたかは関係なく呼ばれます。
このメソッドは一般的にnibファイルからviewが読み込まれた後に何か追加で初期化したい事がある時に使われます。


viewDidUnload

view controllerのviewがメモリから開放されたら呼ばれる


このメソッドはviewDidLoadの対となるものとして呼ばれる。


メモリ不足に陥った時に view controller がview や、viewに関連するオブジェクトを開放して空きメモリが確保できるまで呼ばれる。
view controllerはたいていviewと、viewに関連するオブジェクトを持っているので、メモリ不足の時にメモリを再利用できるように、このメソッドでオブジェクトを手放す必要がある。


viewDidLoadメソッドやアプリの他のパーツから後で簡単に作りなおせるオブジェクトだけ開放するべきで、簡単に作りなおせないユーザーデータや他の情報は開放しないでください。


一般的にはview controllerはIBOutletキーワードを含む変数やプロパティにオブジェクトの参照を保持していてInterfaceBuilderで設定がなされており、view controllerはviewDidLoadメソッドなどよってプログラミングでオブジェクトのポインタも保持しています。


保持しているオブジェクトを開放する好ましい方法はアクセサメソッドなどで値をnilにする事ですが、もしアクセサメソッドを作っていなかったら明示的にオブジェクトを開放してあげる必要がある。


ちなみにこのメソッドが呼ばれる時はviewプロパティはnilになります。

注意点

もし、view controllerがviewや他のオブジェクトを保持していたら、保持しているオブジェクトをdeallocメソッドで安全に破棄する責任があります。


iOS 2.x用のアプリにこのメソッドを実装する場合はdeallocメソッドで各オブジェクトを開放する必要がありますがsuperを呼ぶ前にnilを代入する必要もあります。


viewWillAppear:

view controllerのviewが表示される時にview controllerに通知されます。


このメソッドはレシーバーのviewがスクリーン上に表示される前、もしくは設定されているアニメーションが表示される前に呼ばれる。
このメソッドをオーバーライドする事でviewが表示される時にやりたい事を実装できる。
でも、もし、このメソッドをオーバーライドする時はsuperをどこかで呼んでね。


viewWillDisappear:

view controllerのviewが隠れたり、非表示になったりする時に呼ばれる


このメソッドはviewがwindowから取り除かれたり、他のviewに覆われたりする事に反応して、その前に呼ばれる。
このメソッドをサブクラスでオーバーライドすることで編集を確定したり、viewのファーストレスポンダーを変えたり、他にやりたい事を実装できます。
でも、もし、このメソッドをオーバーライドする時はsuperをどこかで呼んでね。