• 你真的了解UIViewController生命周期吗?


    一:首先了解一下生命周期图

     

    二:UIViewController 生命周期介绍

    1.通过alloc init 分配内存,初始化controller.

    2.loadView
    loadView方法默认实现[super loadView]
    如果在初始化controller时指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件,如果没传xib文件名,默认会加载跟controller同名的xib文件,如果没找到相关联的xib文件,就会创建一个空白的UIView,然后赋給controller的view

    3.viewDidLoad
    当loadView创建完view之后,此时view已经完成加载了,会调用viewDidLoad方法;一般我会在这里做界面上的初始化操作,比如添加按钮,子视图,等等.

    4.viewWillAppear

    view在load完之后,将要显示在屏幕之前会调用这个方法

    在重写这些方法时候最好先调用一下系统的方法之后在做操作。

    5.viewDidAppear
    当view已经在屏幕上显示出来之后,会调用这个方法

     

    当一个视图被移除屏幕并且销毁的时候

     

    6.viewWillDisappear
    当视图将要从屏幕上移除时候调用

    7.viewDidDisappear
    当视图已经从屏幕上移除时候调用

    8.dealloc
    view被销毁时候调用,如果是手动管理内存的话,需要释放掉之前在init和viewDidLoad中分配的内存(类似alloc,new,copy);dealloc方法不能由我们主动调用,必须等引用计数为0时候由系统调用.

    注意:viewDidUnload 在6.0之后已经废弃了。简单来说,对于iOS6,你不需要做任何以前viewDidUnload的事情,更不需要把以前viewDidUnload的代码移动到 didReceiveMemoryWarning方法中

    三:UIViewController 生命周期实例

    首先创建一个 ViewController,并这个页面上放一个button push到下一个页面;查看它的生命周期执行顺序;

    ViewController代码:

     - (void)loadView {
    [super loadView];
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    }
    
    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    self.view.backgroundColor = [UIColor redColor];
    self.navigationItem.leftBarButtonItem =   [[UIBarButtonItem alloc]   initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(barClick:)];
    }
    
    - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%@------%s",[self class], __FUNCTION__);
     }
    
     - (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     NSLog(@"%@------%s",[self class], __FUNCTION__);
     }
    
     - (void)viewWillDisappear:(BOOL)animated {
     [super viewWillDisappear:animated];
     NSLog(@"%@------%s",[self class], __FUNCTION__);
     }
    
     - (void)viewDidDisappear:(BOOL)animated {
     [super viewDidDisappear:animated];
     NSLog(@"%@------%s",[self class], __FUNCTION__);
     }  
    
     #pragma mark - buttonClick
     - (void)barClick:(UIBarButtonItem *)button {
     FirstViewController *VC = [[FirstViewController   alloc] init];
     [self.navigationController   pushViewController:VC animated:YES];
     }

    第二个控制器FirstViewController 代码:

    - (void)loadView {
        [super loadView];
        NSLog(@"%@------%s",[self class], __FUNCTION__);
        }
    
        - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    self.view.backgroundColor = [UIColor greenColor];
    
      }
    
    // 视图将要出现时就会调用
    - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    }
    // 视图完全出现时就会调用
    - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    }
    // 视图将要消失会调用
    - (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    }
    // 视图完全消失会调用
    - (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"%@------%s",[self class], __FUNCTION__);
    }

    在ViewController页面中有一个button 点击button可以push到FirstViewController 由程序运行结果可知: 当刚运行程序时按顺序依次执行:

    1. loadView
    2. viewDidLoad
    3. viewWillAppear
    4. viewDidAppear
    5. viewWillDisappear
    6. FirstViewController loadView
    7. FirstViewController viewDidLoad
    8. FirstViewController viewWillAppear
    9. viewController viewDidDisappear
    10. FirstViewController viewDidappear

    当再一次点击左上角的返回键时 从FirstViewController跳转到viewController 由程序的运行结果可知 程序的运行顺序为;

    1. loadView
    2. viewDidLoad
    3. viewWillAppear
    4. viewDidAppear
    5. viewWillDisappear
    6. FirstViewController loadView
    7. FirstViewController viewDidLoad
    8. FirstViewController viewWillAppear
    9. viewController viewDidDisappear
    10. FirstViewController viewDidappear
    11. FirstViewController viewWillDisappear
    12. viewController viewWillAppear
    13. FirstViewController viewWillDisappear
    14. viewController viewDidAppear

    从程序的执行顺序可以看出来每个viewController只执行一次loadView和viewDidLoad

     

    最近有个妹子弄的一个关于扩大眼界跟内含的订阅号,每天都会更新一些深度内容,在这里如果你感兴趣也可以关注一下(嘿对美女跟知识感兴趣),当然可以关注后输入:github 会有我的微信号,如果有问题你也可以在那找到我;当然不感兴趣无视此信息;

  • 相关阅读:
    【剑指Offer面试编程题】题目1504:把数组排成最小的数--九度OJ
    【剑指Offer面试编程题】题目1373:整数中1出现的次数--九度OJ
    【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ
    【剑指Offer面试编程题】题目1371:最小的K个数--九度OJ
    vue路由传参
    Es5.Es6区别
    面向对象和面向过程
    vuex
    Vue脚手架使用
    vue中fetch请求
  • 原文地址:https://www.cnblogs.com/wujy/p/5822329.html
Copyright © 2020-2023  润新知