UIViewController的生命周期

// 非storyBoard(xib或非xib)都走这个方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSLog(@"%s", __FUNCTION__);
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    
    }
    return self;
}

// 如果连接了串联图storyBoard 走这个方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
     NSLog(@"%s", __FUNCTION__);
    if (self = [super initWithCoder:aDecoder]) {
        
    }
    return self;
}

// xib 加载 完成
- (void)awakeFromNib {
    [super awakeFromNib];
     NSLog(@"%s", __FUNCTION__);
}

// 加载视图(默认从nib)
- (void)loadView {
    NSLog(@"%s", __FUNCTION__);
    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view.backgroundColor = [UIColor redColor];
}

//视图控制器中的视图加载完成,viewController自带的view加载完成
- (void)viewDidLoad {
    NSLog(@"%s", __FUNCTION__);
    [super viewDidLoad];
}


//视图将要出现
- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"%s", __FUNCTION__);
    [super viewWillAppear:animated];
}

// view 即将布局其 Subviews
- (void)viewWillLayoutSubviews {
    NSLog(@"%s", __FUNCTION__);
    [super viewWillLayoutSubviews];
}

// view 已经布局其 Subviews
- (void)viewDidLayoutSubviews {
    NSLog(@"%s", __FUNCTION__);
    [super viewDidLayoutSubviews];
}

//视图已经出现
- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"%s", __FUNCTION__);
    [super viewDidAppear:animated];
}

//视图将要消失
- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s", __FUNCTION__);
    [super viewWillDisappear:animated];
}

//视图已经消失
- (void)viewDidDisappear:(BOOL)animated {
    NSLog(@"%s", __FUNCTION__);
    [super viewDidDisappear:animated];
}

//出现内存警告  //模拟内存警告:点击模拟器->hardware-> Simulate Memory Warning
- (void)didReceiveMemoryWarning {
    NSLog(@"%s", __FUNCTION__);
    [super didReceiveMemoryWarning];
}

// 视图被销毁
- (void)dealloc {
    NSLog(@"%s", __FUNCTION__);
}

打印结果

[ViewController initWithCoder:]
[ViewController awakeFromNib]
[ViewController loadView]
[ViewController viewDidLoad]
[ViewController viewWillAppear:]
[ViewController viewWillLayoutSubviews]
[ViewController viewDidLayoutSubviews]
[ViewController viewWillLayoutSubviews]
[ViewController viewDidLayoutSubviews]
[ViewController viewDidAppear:]
[ViewController viewWillDisappear:]
[ViewController viewDidDisappear:]
[ViewController dealloc]

initWithNibName:bundle:
初始化ViewController 非storyBoard会创建
注意 不要在这里初始化view view的创建只会在loadView

initWithCoder:
stoyBoard不会直接初始化一个VC 而是自动初始化或者segue被创建的时候初始化
因此initWithNibName:bundle:方法不会被调用 但是initWithCoder会被调用

awakeFromNib
当此方法被调用 视图的所有outlet和action已经连接 但还没有确定 可以当做用户偏好设定 有些不能在xib或者storyBoard设置的 可以在此方法中设定

loadView
当执行此方法的时候 如果是nib创建的话 视图控制器(VC)是已经解档并创建好了 接下来的任务就是对视图的初始化
loadView是控制器的view被访问 且为空的时候调用 这是和awakeFromNib 不同点
注 当在内存警告的情况下把视图self.view = nil 那么这个方法可能会被调用多次
loadView不应该手动调用 系统会根据视图控制器有没有视图 去创建或者加载一个视图 如果没有 就创建一个空的视图(这种情况一般为纯代码) 如果有 就加载(系统会根据nibName去找)
注 重写loadView方法 不要调用父类loadView 这样会消耗不必要的资源 

viewDidLoad
当loadView将view加载到内存中 会进一步调用viewDidLoad方法进一步设置 此时 视图层次已经放在内存中 一般做数据初始化 网络请求 删除视图等

viewWillAppear
系统在载入所有数据的时候 将会在屏幕上显示视图 比如重新设置状态栏 导航栏等
如果APP有多个视图做切换 会调用此方法 如果调入这个视图时候 需要做实时的更新 也可以用此方法

viewWillLayoutSubviews
View即将布局其subviews 比如view的bounds改变了等

viewDidLayoutSubviews
View已经布局其subviews

viewDidAppear
view已经添加到控制器

viewWillDisAppear
当前即将被移除 但是还没有触发 removeFromSuperView  

viewDidDisAppear
当前已经被移除 已经触发 removeFromSuperView

dealloc
视图释放 这时候需要对init或者viewDidLoad所创建的对象进行释放 之前没有自动内存管理的时候 需要手动进行释放

didReciveMemoryWarning
当内存够用的时候 APP的视图会保存在内存中 但是手机的内存如果不够用 一些没有正在显示的VC就会收到内存不足的
警告 然后会释放自己拥有的视图 以达到释放内存的目的 但是系统只会释放内存 但是不会释放对象的所有权 所以我们需要
在这里将不需要显示 而保存在内存的对象释放它的所有权 设置为nil

视图生命历程
UIViewController initWithNibName:bundle: 或者 UIViewController initWithCoder:
先从归档文件中加载VC文件 即使是纯代码 也会将nil传给前者

UIView awakeFromNib
处理一些view的额外配置

UIViewController loadView
创建或者加载view 并把它赋值给view

UIViewController viewDidLoad
此时整个视图层级已经放在内存中 可以移除一些视图 或者加载数据

UIViewController viewWillAppear
视图加载完成 即将显示在屏幕上 设置状态栏风格等

UIViewController  viewWillLayoutSubviews
即将开始子视图的布局

UIViewController  viewDidLayoutSubviews
用于通知子视图布局完成

UIViewController  viewDidAppear
视图已经展示

UIViewController viewWillDisAppear
视图即将消失

UIViewController viewDidDisAppear
视图已经消失

UIViewController dealloc
视图释放

总结
1 init方法需要自己调用 loadView或者awakeFromNib 系统自己调用 viewWill/Did 系统自己调用 类似于回调或者通知 用户可以重写里面的方法
2 纯代码编写时 重写loadView方法 不要调用父类方法 纯代码和xib区别在于loadView以及之前
3 initWithNibName 和 awakeFromNib 只调用一次 剩下的可以重复调用 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值