UIViewController ライフサイクルについて その1




UIViewControllerのライフサイクルについて会社での研修の確認で
ちょっと話しに上がったので、まとめてみる事にしました。

まずはUIViewControllerでライフサイクル用に用意されているメソッドを列挙。


- (void)loadView;
- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;


動作確認用に以下のLifeCycleTestプロジェクトをWindowBaseで作成。

LifeCycleTestViewControllerをnib無しで作成。
.mに該当のライフサイクルメソッドを以下のように定義。

【LifeCycleTestViewController.m】

//--------------------------------------------------------------//
#pragma mark -- View lifecycle --
//--------------------------------------------------------------//

- (void)loadView
{
  [super loadView];
  NSLog(@"loadView");
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  NSLog(@"viewDidLoad");

  self.view.backgroundColor = [UIColor yellowColor];
  UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  button.frame =
    CGRectMake((self.view.frame.size.width - 100) /2,
        (self.view.frame.size.height - 30) /2,
        100.0,
        30.0);
  [button setTitle:@"remove" forState:UIControlStateNormal];
  [button addTarget:self action:@selector(removeAction:)  
            forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:button];
}

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  NSLog(@"viewWillAppear");
}

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  NSLog(@"viewDidAppear");
}

- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];
  NSLog(@"viewWillDisappear");
}

- (void)viewDidDisappear:(BOOL)animated
{
  [super viewDidDisappear:animated];
  NSLog(@"viewDidDisappear");
}

//--------------------------------------------------------------//
#pragma mark -- LifeCycleTestViewController method --
//--------------------------------------------------------------//
- (IBAction)removeAction:(id)sender
{
  [self.view removeFromSuperview];
}


Viewが消えるタイミングも確認するために、viewDidLoadメソッドに
UIButtonを生成する処理も入れてます。removeActionでviewを消す感じですね。



次にLifeCycleTestAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
メソッドでLifeCycleTestViewControllerを生成。windowにaddSubviewします。
【LifeCycleTestAppDelegate.h】

@interface LifeCycleTestAppDelegate : NSObject {
  UIWindow *window;
  LifeCycleTestViewController *lctViewController;
}
【LifeCycleTestAppDelegate.m】

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // Override point for customization after application launch.

  lctViewController = [ [LifeCycleTestViewController alloc]init];
  NSLog(@"lctViewController create");
  [window addSubview:lctViewController.view];
  [window makeKeyAndVisible];

  return YES;
}

- (void)dealloc
{
  [lctViewController release];
  [window release];
  [super dealloc];
}


はい、以上で一応準備は完了。
では実行して確認してみます。
下みたいな画面が出ます。


上の画面のremoveボタンを押す所まで処理してログの結果は以下の通りに出ました。

LifeCycleTest[2193:207] lctViewController create
LifeCycleTest[2193:207] loadView
LifeCycleTest[2193:207] viewDidLoad
LifeCycleTest[2193:207] viewWillAppear
LifeCycleTest[2193:207] viewDidAppear
LifeCycleTest[2193:207] viewWillDisappear
LifeCycleTest[2193:207] viewDidDisappear

順序としては
表示系が

loadView → viewDidLoad → viewWillAppear → viewDidAppear
消去系が

viewWillDisappear → viewDidDisappear
の順番ですね。
各メソッドの詳細についても書きたかったのですが、ちょっと長くなってきたので
次回(その2)に続きを書く事にして、本日はこれまでとします。


【今回のサンプルプロジェクト】




Shareしていただけると励みになりますので
良ければよろしくお願いします