Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

1.5 UIViewController3 ライフサイクル

yuichi takeda edited this page Feb 12, 2015 · 6 revisions

参考 : UIViewController Class Reference | ViewController プログラミングガイド

life cycle

UIViewControllerが生成され、表示、レイアウト調整、非表示、破棄のようにUIViewControllerは状態がいくつか遷移します。 その一連の流れのライフサイクルについて解説します。

SampleProjects/1.5/SampleOfLifeCycle に簡単なサンプルアプリがあります。

生成

UIViewControllerの生成方法はいくつかあります。

メソッド 呼ばれるケース
- initWithCoder: UIViewControllerのイニシャライザではなく、準拠しているNSCodingプロトコルのメソッドです。storyboardから生成される場合はこのメソッドが呼ばれます。
- initWithNibName:bundle: UIViewControllerのレイアウトを記述したxibからViewControllerを生成する際に呼ばれるメソッドです。
-init NSObjectのイニシャライザです。UIViewControllerでこのメソッドを呼んだ場合、自動的に - initWithNibName:bundle: が呼ばれます

初期化のメソッドも複数あるので、呼び出し方、呼び出され方を意識してイニシャライザを記述する必要があります。 またこのイニシャライザが呼ばれた段階ではViewControllerとしてのインスタンスは生成されていますがviewのインスタンスは生成されていません。 そのために、これらのイニシャライザの中でviewのレイアウトをすることはできないので注意が必要です。

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // 初期化のコードをここに記述する
    }
    return self;
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:NSStringFromClass([self class]) bundle:nibBundleOrNil];
    if (self) {
        // 初期化のコードをここに記述する
    }
    return self;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        // 初期化のコードをここに記述する
    }
    return self;
}

viewの読み込みが完了すると - viewDidLoad が呼ばれます。 この段階ではviewのインスタンスが準備できているのでレイアウトや追加のコードを挿入することもできます。 このメソッドはviewの読み込みが完了した一回のみ呼び出されます。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"viewDidLoad");
}

表示

インスタンスが生成され、viewが表示されるタイミングでは - viewWillAppear:- viewDidAppear:

が呼ばれます。それぞれ、viewが表示される直前とviewが表示完了した直後に呼ばれます。例えばアニメーションを行ってViewControllerを表示する場合、

viewWillAppear: → 表示アニメーション → viewDidAppear: の順に呼び出されます。

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

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

これらのメソッドは表示される度に呼び出されます。例えばモーダルで新しいViewControllerを表示して、モーダルを閉じると 再び画面が表示されるのでこれらのメソッドが呼ばれます。

レイアウトの調整

UIViewControllerのviewのレイアウトの調整が何度か行われます。 例えばstoryboardやxibから読み出した状態ではviewControllerのサイズはそのstoryboardやxibでレイアウトを記述したときのサイズで読み出されるので、画面サイズに合わせて調整が行われます。 他にも、画面を回転したときにもレイアウトの調整などが行われます。この時にこれらのメソッドが呼び出されます。

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

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

非表示

ViewControllerインスタンスが非表示になるとき、なった時にそれぞれ - viewWillDisappear:- viewDidDisappear:が呼ばれます。 表示の時と同様に、それぞれ非表示になる直前、直後に呼ばれます。遷移アニメーションとの組み合わせは

- viewWillDisappear: → 遷移アニメーション → - viewDidDisappear:

のようになります。このメソッドも非表示になる度に呼ばれ、何度も呼ばれる可能性があります。

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

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

viewの表示、非表示の状態遷移

Figure 1Valid State Transitions UIViewController Class Referenceより

破棄

オブジェクトが誰からも参照されなくなり、メモリから解放されるときに- deallocが呼ばれます。 UIViewController固有のものではなくNSObjectのメソッドになります。ARCでメモリ管理をしている場合、[super dealloc] のようにスーパークラスのdeallocを呼ぶとコンパイルエラーとなります。

-(void)dealloc
{
    NSLog(@"dealloc");
}

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally