VC生命周期(Bd interview)

通过三个VC,第1个VC是storyBoard创建的,第2个VC是纯code创建的,第3个是xib创建的。分别称为BoardViewController、CodeInitViewController、XibViewController,这三个控制器采用导航模式进行交互,现在在VC中把所有跟初始化相关的方法都实现一下并做打印,如下:
程序启动,加载storyBoard实例化ViewController
// BoardVC


+ (void)load {
    [super load];
    NSLog(@"boardVC     %s     ",__func__);
}

+ (void)initialize
{
    [super initialize];
    NSLog(@"boardVC     %s     ",__func__);
}

+ (instancetype)alloc {
    NSLog(@"boardVC     %s     ",__func__);
   return [super alloc];
}


- (instancetype)initWithCoder:(NSCoder *)coder
{
     NSLog(@"boardVC     %s     ",__func__);
    
    return [super initWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
     NSLog(@"boardVC     %s     ",__func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (instancetype)init
{
    NSLog(@"boardVC     %s     ",__func__);
    return [super init];
}

- (void)loadView {
    [super loadView];
    NSLog(@"boardVC     %s     ",__func__);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    NSLog(@"boardVC     %s     ",__func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
     NSLog(@"boardVC     %s     ",__func__);
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"boardVC     %s     ",__func__);
}

- (void)viewWillDisappear:(BOOL)animated {
     [super viewWillDisappear:animated];
    NSLog(@"boardVC     %s     ",__func__);
}

- (void)viewDidDisappear:(BOOL)animated {
     [super viewDidDisappear:animated];
    NSLog(@"boardVC     %s     ",__func__);
}

- (void)viewWillLayoutSubviews {
     [super viewWillLayoutSubviews];
    NSLog(@"boardVC     %s     ",__func__);
}


- (void)viewDidLayoutSubviews {
      [super viewDidLayoutSubviews];
    NSLog(@"boardVC     %s     ",__func__);
}

-(void)dealloc {
    NSLog(@"boardVC     %s     ",__func__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   
    CodeInitViewController *table = [[CodeInitViewController alloc]init];
       [self.navigationController pushViewController:table animated:true];
 }

打印结果

2020-05-26 18:22:18.500999+0800 OCTestFirst[2800:709106] boardVC     +[ViewController load]
2020-05-26 18:22:18.692716+0800 OCTestFirst[2800:709106] willFinishLaunchingWithOptions
2020-05-26 18:22:18.692835+0800 OCTestFirst[2800:709106] didFinishLaunchingWithOptions
2020-05-26 18:22:18.734249+0800 OCTestFirst[2800:709106] DidBecomeActive
2020-05-26 18:22:20.199220+0800 OCTestFirst[2800:709106] boardVC     +[ViewController initialize]
2020-05-26 18:22:20.199373+0800 OCTestFirst[2800:709106] boardVC     +[ViewController alloc]
2020-05-26 18:22:20.199450+0800 OCTestFirst[2800:709106] boardVC     -[ViewController initWithCoder:]
2020-05-26 18:22:20.215590+0800 OCTestFirst[2800:709106] boardVC     -[ViewController loadView]
2020-05-26 18:22:20.215777+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewDidLoad]
2020-05-26 18:22:20.215887+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewWillAppear:]
2020-05-26 18:22:20.240197+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewWillLayoutSubviews]
2020-05-26 18:22:20.240350+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewDidLayoutSubviews]
2020-05-26 18:22:20.746574+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewDidAppear:]
2020-05-26 18:22:32.853754+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewWillDisappear:]
2020-05-26 18:22:33.368178+0800 OCTestFirst[2800:709106] boardVC     -[ViewController viewDidDisappear:]
2020-05-26 18:22:33.368894+0800 OCTestFirst[2800:709106] boardVC     -[ViewController dealloc]

//CodeVC
从ViewController中push到纯代码实例化的CodeInitViewController中


+ (void)load {
    [super load];
    NSLog(@"CodeVC     %s     ",__func__);
}

+ (void)initialize
{
    [super initialize];
    NSLog(@"CodeVC     %s     ",__func__);
}

+ (instancetype)alloc {
    NSLog(@"CodeVC     %s     ",__func__);
   return [super alloc];
}


- (instancetype)initWithCoder:(NSCoder *)coder
{
     NSLog(@"CodeVC     %s     ",__func__);
    
    return [super initWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
     NSLog(@"CodeVC     %s     ",__func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (instancetype)init
{
    NSLog(@"CodeVC     %s     ",__func__);
    return [super init];
}

- (void)loadView {
    [super loadView];
    NSLog(@"CodeVC     %s     ",__func__);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    NSLog(@"CodeVC     %s     ",__func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
     NSLog(@"CodeVC     %s     ",__func__);
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"CodeVC     %s     ",__func__);
}

- (void)viewWillDisappear:(BOOL)animated {
     [super viewWillDisappear:animated];
    NSLog(@"CodeVC     %s     ",__func__);
}

- (void)viewDidDisappear:(BOOL)animated {
     [super viewDidDisappear:animated];
    NSLog(@"CodeVC     %s     ",__func__);
}

- (void)viewWillLayoutSubviews {
     [super viewWillLayoutSubviews];
    NSLog(@"CodeVC     %s     ",__func__);
}


- (void)viewDidLayoutSubviews {
      [super viewDidLayoutSubviews];
    NSLog(@"CodeVC     %s     ",__func__);
}

-(void)dealloc {
    NSLog(@"CodeVC     %s     ",__func__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //通过xib创建
       XibInitViewController *xibVc = [[XibInitViewController alloc] init];
       [self.navigationController pushViewController:xibVc animated:YES];
}

打印结果

2020-05-26 18:28:46.349207+0800 OCTestFirst[2806:710479] CodeVC     +[CodeInitViewController initialize]
2020-05-26 18:28:46.349516+0800 OCTestFirst[2806:710479] CodeVC     +[CodeInitViewController alloc]
2020-05-26 18:28:46.349685+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController init]
2020-05-26 18:28:46.350136+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController initWithNibName:bundle:]
2020-05-26 18:28:46.352376+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController loadView]
2020-05-26 18:28:46.352579+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController viewDidLoad]
2020-05-26 18:28:46.352706+0800 OCTestFirst[2806:710479] boardVC     -[ViewController viewWillDisappear:]
2020-05-26 18:28:46.352924+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController viewWillAppear:]
2020-05-26 18:28:46.368752+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController viewWillLayoutSubviews]
2020-05-26 18:28:46.368949+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController viewDidLayoutSubviews]
2020-05-26 18:28:46.875170+0800 OCTestFirst[2806:710479] boardVC     -[ViewController viewDidDisappear:]
2020-05-26 18:28:46.875625+0800 OCTestFirst[2806:710479] CodeVC     -[CodeInitViewController viewDidAppear:]

//XibVC
//从CodeInitViewController中push到Xib实例化的XibInitViewController中


+ (void)load {
    [super load];
    NSLog(@"XibVC     %s     ",__func__);
}

+ (void)initialize
{
    [super initialize];
    NSLog(@"XibVC     %s     ",__func__);
}

+ (instancetype)alloc {
    NSLog(@"XibVC     %s     ",__func__);
   return [super alloc];
}


- (instancetype)initWithCoder:(NSCoder *)coder
{
     NSLog(@"XibVC     %s     ",__func__);
    
    return [super initWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
     NSLog(@"XibVC     %s     ",__func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (instancetype)init
{
    NSLog(@"XibVC     %s     ",__func__);
    return [super init];
}

- (void)loadView {
    [super loadView];
    NSLog(@"XibVC     %s     ",__func__);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    NSLog(@"XibVC     %s     ",__func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
     NSLog(@"XibVC     %s     ",__func__);
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"XibVC     %s     ",__func__);
}

- (void)viewWillDisappear:(BOOL)animated {
     [super viewWillDisappear:animated];
    NSLog(@"XibVC     %s     ",__func__);
}

- (void)viewDidDisappear:(BOOL)animated {
     [super viewDidDisappear:animated];
    NSLog(@"XibVC     %s     ",__func__);
}

- (void)viewWillLayoutSubviews {
     [super viewWillLayoutSubviews];
    NSLog(@"XibVC     %s     ",__func__);
}


- (void)viewDidLayoutSubviews {
      [super viewDidLayoutSubviews];
    NSLog(@"XibVC     %s     ",__func__);
}

-(void)dealloc {
    NSLog(@"XibVC     %s     ",__func__);
}

打印结果

2020-05-26 18:35:59.941913+0800 OCTestFirst[2810:711935] XibVC     +[XibInitViewController initialize]
2020-05-26 18:35:59.942075+0800 OCTestFirst[2810:711935] XibVC     +[XibInitViewController alloc]
2020-05-26 18:35:59.942398+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController init]
2020-05-26 18:35:59.942478+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController initWithNibName:bundle:]
2020-05-26 18:35:59.943799+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController loadView]
2020-05-26 18:35:59.943931+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewDidLoad]
2020-05-26 18:35:59.944001+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController viewWillDisappear:]
2020-05-26 18:35:59.944139+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewWillAppear:]
2020-05-26 18:35:59.954332+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewWillLayoutSubviews]
2020-05-26 18:35:59.954551+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewDidLayoutSubviews]
2020-05-26 18:36:00.460159+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController viewDidDisappear:]
2020-05-26 18:36:00.460642+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewDidAppear:]

将XibInitViewController进行Pop后

2020-05-26 19:00:01.057918+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewWillDisappear:]
2020-05-26 19:00:01.058504+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController viewWillAppear:]
2020-05-26 19:00:01.587221+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController viewDidDisappear:]
2020-05-26 19:00:01.587698+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController viewDidAppear:]
2020-05-26 19:00:01.588180+0800 OCTestFirst[2810:711935] XibVC     -[XibInitViewController dealloc]

将CodeInitViewController进行Pop后

2020-05-26 19:00:53.743490+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController viewWillDisappear:]
2020-05-26 19:00:53.743744+0800 OCTestFirst[2810:711935] boardVC     -[ViewController viewWillAppear:]
2020-05-26 19:00:54.265181+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController viewDidDisappear:]
2020-05-26 19:00:54.265638+0800 OCTestFirst[2810:711935] boardVC     -[ViewController viewDidAppear:]
2020-05-26 19:00:54.266098+0800 OCTestFirst[2810:711935] CodeVC     -[CodeInitViewController dealloc]

总结一

+load: 程序启动后,在系统的main函数调用之前,系统就会加载所有的load方法,提前进行一些资源包的配置或者hook,(可以打断点看看结果,本人亲测过)这部分是在pre-main阶段做的
 
 +initialize: 当前类或者其子类未被初始化过时会首次调用,若以后当前类或者子类再多次初始化时不会再调用,一般提前为初始化做一些工作
 
 +alloc: 系统为当前类分配内存时调用,在C语言中就是malloc这一步
 
 -initWithCoder: 通过storyBoard方式实例化的vc,需要经过反序列化,这个方法会被调用
 
 -initWithNibName:bundle: 通过xib文件或者init方法实例化的vc,这个方法都会被调用,其实init方法最终都会走该方法
 
 -init: 通过纯代码实例化Vc会调用,其最终会调用initWithNibName:bundle:方法
 
 -loadView: 实例化Vc后,可以加载一些系统常规的View
 -viewDidLoad: 一般加载自定义的view或者初始化属性,视图加载完毕后会调用
 
 -viewWillAppear: 视图即将出现会调用
 
 -viewWillDisappear: 视图即将消失会调用
 
 -viewWillLayoutSubviews: 视图加载完毕后即将要布局
 
 -viewDidLayoutSubviews: 视图加载完毕后布局也完成了
 
 -didReceiveMemoryWarning: 加载视图时,内存消耗太大,出现内存警告,会调用
 
 -dealloc: 实例化被销毁,进行内存的回收会调用

总结二

程序一启动,系统在当前应用程序的所有方法被调用之前优先加载load方法;
控制器生命的正常流程是:初始化--->加载视图--->将要显示---->布局子视图---->完全显示---->将要显示---->完全消失----->对象销毁(有可能内存警告释放)
控制器交互的前后显隐流程是交叉的,在源VC即将消失和目的VC即将显示之后,目的VC会完成所有子视图的布局,然后源VC才会真正消失目的VC真正显示
控制器交互消失的流程也是交叉的,目的VC即将消失,源VC即将显示,目的VC完全消失,源VC完全显示,接着释放目的VC
通过stroyBoard创建的VC一定需要反序列化
通过纯代码和xib创建的VC,最终都会调用initWithNibName:bundle:方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值