&tag(UIKit, UIViewController); *目次 [#f51561f0] #contents *生成 [#e08d10c1] **呼び出し側 [#l61a142d] #pre{{ // xibファイルを使わない場合 SampleViewController *controller = [[SampleViewController alloc] init]; // xibファイルを使う場合 SampleViewController *controller = [[SampleViewController alloc] initWithNibName:@"SamViewController" bundle:nil]; }} **内部のビューをコードで生成する [#s332857f] -viewDidLoadなどでUIViewのインスタンスを生成する。サイズは既存のviewのサイズと同じにする。 #pre{{ - (void)viewDidLoad { [super viewDidLoad]; textView = [[UITextView alloc] initWithFrame:self.view.bounds]; [textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; [self.view addSubview:textView]; } }} *画面遷移 [#a244c6dd] **他のビューコントローラーを呼び出す [#ka8c241b] #pre{{ EditListViewController *editListViewController = [[EditListViewController alloc] initWithStyle:UITableViewStyleGrouped]; [[self navigationController] pushViewController:editListViewController animated:YES]; [editListViewController release]; }} *ライフサイクル [#qb3d5ede] **メソッド呼び出し順序と役割 [#e2a3b267] ***initWithNibName:bundle or initWithCoder [#m7a470d2] -コンストラクタ。 -iniWithNibName:bundlerはnibつきでよびだされたとき。 -initWithCoderはUIViewControllerが自身がnibファイルに格納されていて初期化される場合。 -どちらから呼ばれるかわからないときは共通のイニシャライザを作成し(例えばinitというメソッド)それを呼び出す。 ***loadView [#h2adf8b1] -nibファイルを使わない場合に呼ばれる。 -self.viewにプログラムでUIViewを生成して設定する場合はここ。 ***viewDidLoad [#a2441b37] -nibファイル使ったかどうかに関係なく呼び出される。 -self.viewのサブビューを生成する場合ここで。 ***viewDidUnload [#v695ad5e] -didReceiveMemoryWarningから呼ばれる。この後(loadView→、viewDidLoadの流れになる)ので、その辺で作ってretainしているモノは解放する必要がある。IBOutletも解放する必要がある。プロパティの場合nilを設定して解放しつつ後に間違ってアクセスしないようにするのが良い。 ***dealloc [#yc54c65e] -viewDidUnloadと同じものを解放+コンストラクタで生成したものを解放。 -deallocからviewDidUnloadを呼んでもいいらしい。[[リファクタリング講座メモ - Over&Out その後:http://d.hatena.ne.jp/shu223/20110531/1307300906]]を参照。グレーゾーンだったのは、viewDidUnloadの中で呼ぶ[super viewDidUnload]がなんかするかもしれないからかな。呼んでもよい根拠は海外の有名ライブラリがみんな呼んでるから。 **deallocとviewDidUnLoad [#jae9c59c] -[[viewDidUnloadとdealloc - ASとか:http://d.hatena.ne.jp/murakaming/20110901/1314839222]]にあるように、サンプルコードなどではviewDidUnLoadは大抵無視されているけどちゃんとメモリ解放処理をいれておいたほうがよさそう。理由はメモリ警告でdidReceiveMemoryWarningが起こったとき、viewDidUnLoadが呼び出され、次回ビューが呼び出されたとき、viewDidLoadが再度よばれるから。何の手当もしてないとメモリリークが発生する。 -viewDidUnload: viewDidLoadで確保したメモリを解放する。 -dealloc: initとviewDidLoadで確保したメモリを解放する。 *Tips [#ja08a9ae] ** super xxxを忘れるな [#i540f9ef] -例えば、viewDidLoadや、viewDidUnloadで superの同名メソッドをちゃんとよばないとだめっぽい。 #pre{{ - (void)viewDidLoad { [super viewDidLoad]; ...ここでいろいろ... } - (void)viewDidUnload { [super viewDidUnload]; ...ここでいろいろ... } }} -ちなみに、superを呼び出す場所は先頭っぽい。deallocのときは最後によぶのがよい? #pre{{ - (void)dealloc { ...ここでいろいろ解放 [super dealloc]; } }} **viewのレイアウト [#s6cf2f59] -[[iphone - Can somebody explain the process of a UIViewController birth (which method follows which)? - Stack Overflow:http://stackoverflow.com/questions/5107604/can-somebody-explain-the-process-of-a-uiviewcontroller-birth-which-method-follo]] -viewDidLoadではきまらず、viewWillAppearでないとだめっぽい。 -iOS5移行ならviewDidLayoutSubviewsあたりがいいかも?