UIKitのUIViewControllerのライフサイクルについてテンプレートを交えて解説したいと思います。
UIViewControllerはviewの振る舞いを管理するクラスで、複数のビューを階層的に管理する事が出来ます。
そして、viewの振る舞いによって呼ばれるデリゲートメソッドには
呼び出し順序とタイミングがあります。
今回は、そんな呼び出し順序とタイミングをライフサイクルとし、
解説したいと思います。
UIViewControllerのライフサイクル
まずはライフサイクル用のテンプレートとして下記を用意しました。
/* ライフサイクル1:初期化 --------------------------------------------------------------*/ -(id)init { if( self = [super init] ){ } return( self ); } /* ライフサイクル2:self.viewの作成 --------------------------------------------------------------*/ -(void)loadView { [super loadView]; } /* ライフサイクル3:viewの初回構築&メモリワーニング時の再構築 --------------------------------------------------------------*/ -(void)viewDidLoad { [super viewDidLoad]; } /* ライフサイクル4:view表示直前 --------------------------------------------------------------*/ -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } /* ライフサイクル5:view表示直後 --------------------------------------------------------------*/ -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } /* ライフサイクル6:view非表示直前 --------------------------------------------------------------*/ -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } /* ライフサイクル7:view非表示直後 --------------------------------------------------------------*/ -(void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } /* ライフサイクル8:viewのアンロード時 --------------------------------------------------------------*/ -(void)viewDidUnload { [super viewDidUnload]; } /* ライフサイクル9:破棄 --------------------------------------------------------------*/ -(void)dealloc { [super dealloc]; } /* ライフサイクル10:メモリワーニング時 --------------------------------------------------------------*/ -(void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; }
コメントにもあるように、画面の初期化から構築、表示から非表示と流れ、最終的にデータを破棄します。
また、メモリワーニング時に呼ばれるメソッドがあり、
メモリワーニング時にはViewから削除されていくので、
メモリワーニング時にviewの再構築が行われるviewDidLoadの存在を基本に開発していきましょう。
基本的なviewをviewDidLoadにて構築する事によって、メモリワーニングに陥っても動くアプリを目指します。
それぞれの処理を、どのタイミングで実行するのが最適なのか、
デリゲートメソッドが呼ばれるタイミングをちゃんと把握して実装する事で、
予期せぬ誤作動を防ぐ事が出来ます。
後は開発者の意思次第ですので、細かい使い方は省きます。
ただ単に、それぞれのタイミング、順序でメソッドが自動的に叩かれ、
適した処理をメソッド内に記述していく実装方法がUIViewControllerベースのアプリ開発です。
頭の中で常にライフサイクルをイメージしながら実装しましょう。
そうする事によって、予期せぬバグが出てもデバッグがしやすくなります。