通过三个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:方法