iOS-控制器的生命周期

1. 控制器View的创建

首先我们来看一下控制器view创建的流程图

从图中我们可以看出,在控制器view加载过程中有两个重要的方法loadView和viewDidLoad。下面我们来重点了解一下这两个方法。

loadView方法

作用:loadView方法是用来负责创建UIViewController的view。首先判断下有没有指定storyboard或者xib,如果指定,就会加载它们描述的控制器的view,如果没有指定,创建一个空的view。

什么时候调用:每次访问UIViewController的view,当view为nil,就会调用loadView方法。

viewDidLoad

作用:一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图等。

什么时候调用:每当view创建完毕的时候,最终都会调用viewDidLoad方法。

其次,在view创建过程中还有一些需要注意的地方。

通过storyboard创建的控制器,或者通过xib创建的控制器的view,系统会帮我们加载控制器的view,具体内部实现可以看iOS-UIWindow详解,在此不在赘述

2.ViewController *vc = [[ViewController alloc]init];

底层也会调用-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil方法。

(1).判断下有没有指定nibName,如果指定了,就会去加载指定的xib

(2).如果没有指定,就会判断下有没有跟控制器类名同名的xib,有,就会去加载

(3).判断下有没有跟控制器类名同名的xib,但是后缀不带Controller的xib,如果有,就会去加载

(4).如果没有任何xib描述控制器的view,就不会加载xib。会创建一个颜色为clearColor的view。

2. 控制器View的生命周期

控制器View的生命周期方法

loadView:                        加载view

viewDidLoad:                  view加载完毕

viewWillAppear:              控制器的view将要显示

viewWillLayoutSubviews: 控制器的view将要布局子控件

viewDidLayoutSubviews: 控制器的view布局子控件完成

viewDidAppear:                控制器的view完全显示

viewWillDisappear:        控制器的view即将消失的时候

viewDidDisappear:        控制器的view完全消失的时候

view生命周期方法调用顺序

viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear

3. 控制器View的延迟加载

控制器的view是延迟加载的:创建控制器并不一定会创建控制器的view,等用到时再加载

下面我们通过一个小的程序来验证一下

AppDelegate.m

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {// Override point for customization after application launch.self.window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];// 创建控制器,并一定会创建控制器的viewViewController *vc = [[ViewController alloc] init];        vc.view.backgroundColor = [UIColorredColor];self.window.rootViewController = vc;        [self.window makeKeyAndVisible];returnYES;}```ViewController.m

import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

// 自定义控制器的view

(void)loadView

{

NSLog(@"%s",func);

UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];

view.backgroundColor = [UIColor greenColor];

self.view = view;

}

// 控制器的view加载完成的时候调用

(void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

self.view.backgroundColor = [UIColor blueColor];

NSLog(@"%s",func);

}```

此时打印我们发现控制器的view颜色是红色的,这是因为view的get方法底层中实现了loadView 和 viewDidLoad方法,loadView中将view设置为绿色,viewDidLoad方法中又将view设置成蓝色,但是最后被vc.view.backgroundColor = [UIColor redColor];设置为红色。

1.2 storyboard 间接实例化(initWithCoder)

当你从 storyboard 初始化 ViewController 时,iOS 会使用 initWithCoder,而不是 initWithNibName 来初始化这个 ViewController,然后那个 storyboard 会在自己内部生成一个 nib (storyboard 实例化 view / ViewController 时,会把 nib 的信息放在 Coder 中,调用 initWithCoder)。

你可能感兴趣的:(iOS-控制器的生命周期)