-
-[ViewController initWithCoder:]
或-[ViewController initWithNibName:Bundle]
:首先从归档文件中加载UIViewController
对象。即使是纯代码,也会把nil作为参数传给后者。 -
-[UIView awakeFromNib]
:作为第一个方法的助手,方便处理一些额外的设置。 -
-[ViewController loadView]
:创建或加载一个view并把它赋值给UIViewController的view属性 -
-[ViewController viewDidLoad]
:此时整个视图层次(view hierarchy)已经被放到内存中,可以移除一些视图,修改约束,加载数据等 -
-[ViewController viewWillAppear:]
:视图加载完成,并即将显示在屏幕上,还没有设置动画,可以改变当前屏幕方向或状态栏的风格等。 -
-[ViewController viewWillLayoutSubviews]
:即将开始子视图位置布局 -
-[ViewController viewDidLayoutSubviews]
:用于通知视图的位置布局已经完成 -
-[ViewController viewDidAppear:]
:视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。 -
-[ViewController viewWillDisappear:]
:视图即将消失 -
-[ViewController viewDidDisappear:]
:视图已经消失
如果考虑UIViewController可能在某个时刻释放整个View。那么再次加载视图时显然会从步骤3开始。因为此时的UIViewController对象依然存在。
DemoViewController *demoVC = [[DemoViewController alloc] init];
[self presentViewController:demoVC
animated:YES
completion:^{
NSLog(@"presentViewController");
[self dismissViewControllerAnimated:YES
completion:^{
NSLog(@"dismissViewContro"
@"llerAnimated");
}];
}];
2016-05-02 16:04:15.066 UIViewLifeCycle[1509:685319] initWithNibName
2016-05-02 16:04:15.067 UIViewLifeCycle[1509:685319] init
2016-05-02 16:04:15.068 UIViewLifeCycle[1509:685319] loadView
2016-05-02 16:04:15.068 UIViewLifeCycle[1509:685319] viewDidLoad
2016-05-02 16:04:15.070 UIViewLifeCycle[1509:685319] viewWillAppear
2016-05-02 16:04:15.071 UIViewLifeCycle[1509:685319] viewWillLayoutSubviews
2016-05-02 16:04:15.071 UIViewLifeCycle[1509:685319] viewDidLayoutSubviews
2016-05-02 16:04:15.573 UIViewLifeCycle[1509:685319] viewDidAppear
2016-05-02 16:04:15.573 UIViewLifeCycle[1509:685319] presentViewController
2016-05-02 16:04:15.575 UIViewLifeCycle[1509:685319] viewWillDisappear
2016-05-02 16:04:16.078 UIViewLifeCycle[1509:685319] viewDidDisappear
2016-05-02 16:04:16.078 UIViewLifeCycle[1509:685319] dismissViewControllerAnimated
需要注意的是,initWithNibName方法始终会被调用~
那么我想到一个问题:我们通常会去提供一些比较完备的初始化方法,写大量重复的代码,现在是不是将一些必须的初始化方法放在initWithNibName方法中,就肯定可以得到执行呢?也就是说,我们无论如何,也应该实现initWithNibName方法?