iOS—ViewController生命周期

  • loadView:加载view。这个方法中,要正式加载View了,控制器 view 是通过懒加载的方式进行加载的,即用到的时候再加载。在 view 加载过程中首先会调用 loadView 方法,在这个方法中主要完成一些关键 view 的初始化工作。接下来就是加载 view,加载成功后,会接着调用 viewDidLoad 方法,这里要记住的一点是,在 loadView 之前,是没有 view 的,也就是说,在这之前,view 还没有被初始化。此方法在控制器的view为nil的时候被调用。
    死循环 若 loadView 没有加载 view,即为 nil,viewDidLoad 会一直调用 loadView 加载 view,因此构成了死循环
  • viewDidLoad:view加载完毕。当控制器的 loadView 方法执行完毕,view 被创建成功后,就会执行 viewDidLoad 方法
  • viewWillAppear:控制器的view将要显示
  • viewWillLayoutSubviews:控制器的view将要布局子控件
  • viewDidLayoutSubviews:控制器的view布局子控件完成
  • viewWillDisappear:控制器的view即将消失的时候。在视图变换时,当前视图在即将被移除、或者被覆盖时,会调用这个方法进行一些善后的处理和设置。
  • viewDidDisappear:控制器的view完全消失的时候。
  • dealloc:视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

代码

#import "ViewController.h"
#import "SecondViewController.h"

int t = 0;

@interface ViewController ()

@end

@implementation ViewController


- (void)loadView {
    [super loadView];
    NSLog(@"    %d loadView1", ++t);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"    %d viewDidLoad1", ++t);
    
    UIButton *next = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.view addSubview:next];
    next.frame = CGRectMake(100, 100, 70, 40);
    next.backgroundColor = [UIColor colorWithWhite:0.8 alpha:1];
    next.layer.cornerRadius = 7;
    [next setTitle:@"next" forState:UIControlStateNormal];
    [next addTarget:self action:@selector(next) forControlEvents:UIControlEventTouchUpInside];

}

- (void)next {
    SecondViewController *two = [[SecondViewController alloc] init];
    two.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:two animated:YES completion:nil];
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"    %d viewWillLayoutSubviews1", ++t);
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"    %d viewDidLayoutSubviews1", ++t);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"    %d viewWillAppear1", ++t);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"    %d viewDidAppear1\n", ++t);
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"    %d viewWillDisappear1", ++t);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"    %d viewDidDisappear1", ++t);
}

- (void)dealloc {
    NSLog(@"    %d dealloc1", ++t);
}
@end


#import "SecondViewController.h"

int q = 0;

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)loadView {
    [super loadView];
    NSLog(@"    %d loadView2", ++q);
}


- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"    %d viewDidLoad2", ++q);
    self.view.backgroundColor = [UIColor grayColor];
    
    UIButton *back = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.view addSubview:back];
    back.frame = CGRectMake(100, 200, 70, 40);
    back.backgroundColor = [UIColor whiteColor];
    back.layer.cornerRadius = 7;
    [back setTitle:@"back" forState:UIControlStateNormal];
    [back addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    
  
}

- (void)back {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"    %d viewWillLayoutSubviews2", ++q);
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"    %d viewDidLayoutSubviews2", ++q);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"    %d viewWillAppear2", ++q);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"    %d viewDidAppear2", ++q);
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"    %d viewWillDisappear2", ++q);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"    %d viewDidDisappear2", ++q);
}

- (void)dealloc {
    NSLog(@"    %d dealloc2", ++q);
}
@end


运行:

1
打印如下:
打印1
点击next按钮 , 跳转到第二个页面
页面2
后续打印如下:
打印2
点击back按钮返回第一个页面
后续打印如下:
打印3

这里注意viewDisappear的时间,都是在viewDidAppear另一个页面之后才执行的


具体看这两篇
参考一
参考二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值