&tag(UIKit, UIViewController);
// xibファイルを使わない場合
SampleViewController *controller = [[SampleViewController alloc] init];
// xibファイルを使う場合
SampleViewController *controller = [[SampleViewController alloc] initWithNibName:@"SamViewController" bundle:nil];
内部のビューをコードで生成する†[edit]
他のビューコントローラーを呼び出す†[edit]
EditListViewController *editListViewController = [[EditListViewController alloc] initWithStyle:UITableViewStyleGrouped];
[[self navigationController] pushViewController:editListViewController animated:YES];
[editListViewController release];
メソッド呼び出し順序と役割†[edit]
initWithNibName:bundle or initWithCoder†[edit]
- コンストラクタ。
- iniWithNibName:bundlerはnibつきでよびだされたとき。
- initWithCoderはUIViewControllerが自身がnibファイルに格納されていて初期化される場合。
- どちらから呼ばれるかわからないときは共通のイニシャライザを作成し(例えばinitというメソッド)それを呼び出す。
- nibファイルを使わない場合に呼ばれる。
- self.viewにプログラムでUIViewを生成して設定する場合はここ。
viewDidLoad†[edit]
- nibファイル使ったかどうかに関係なく呼び出される。
- self.viewのサブビューを生成する場合ここで。
viewDidUnload†[edit]
- didReceiveMemoryWarningから呼ばれる。この後(loadView→、viewDidLoadの流れになる)ので、その辺で作ってretainしているモノは解放する必要がある。IBOutletも解放する必要がある。プロパティの場合nilを設定して解放しつつ後に間違ってアクセスしないようにするのが良い。
- viewDidUnloadと同じものを解放+コンストラクタで生成したものを解放。
- deallocからviewDidUnloadを呼んでもいいらしい。リファクタリング講座メモ - Over&Out その後を参照。グレーゾーンだったのは、viewDidUnloadの中で呼ぶ[super viewDidUnload]がなんかするかもしれないからかな。呼んでもよい根拠は海外の有名ライブラリがみんな呼んでるから。
deallocとviewDidUnLoad†[edit]
- viewDidUnloadとdealloc - ASとかにあるように、サンプルコードなどではviewDidUnLoadは大抵無視されているけどちゃんとメモリ解放処理をいれておいたほうがよさそう。理由はメモリ警告でdidReceiveMemoryWarningが起こったとき、viewDidUnLoadが呼び出され、次回ビューが呼び出されたとき、viewDidLoadが再度よばれるから。何の手当もしてないとメモリリークが発生する。
- viewDidUnload: viewDidLoadで確保したメモリを解放する。
- dealloc: initとviewDidLoadで確保したメモリを解放する。