- 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
运行:
打印如下:
点击next按钮 , 跳转到第二个页面
后续打印如下:
点击back按钮返回第一个页面
后续打印如下:
这里注意viewDisappear的时间,都是在viewDidAppear另一个页面之后才执行的