UIViewController 视图控制器是我们在做开发过程进行视图和控件主要实现管理类,很多情况下我们都会与之打交道。
在整个 APP 运行期间也是每一个视图进行加载、展示和消除的过程。
UIViewController 周期
下图是 UIViewController 周期过程:

下面小编依次在 UIViewController 视图控制器中列出上面视图周期,然后进行跳转下一个界面看下操作的后 UIViewController 具体周期打印结果。
实现代码如下:
1 | - (void)viewDidLoad { |
执行上面的操作,然后点击按钮跳转下一个 UIViewController 视图控制器。打印出的结果如下:
1 | [58066:17044982] load Method: loadView |
上面并没有执行 viewWillUnload 和 viewDidUnload,点开文档我们可以看到下面一段文字。
Called after the view controller’s view is released and set to nil. For example, a memory warning which causes the view to be purged. Not invoked as a result of -dealloc.
因为当前只有两个控制器,所以并没有调用 didReceiveMemoryWarning。也就说当前视图控制器并没有销毁,还在内存中。
上面打印的结果很好验证小编所整理
UIViewController在加载、展示和销毁过后过程执行。
loadView、viewDidLoad 和 viewDidUnload 关系
在网上搜索一下关于 UIViewController 的周期问题,看到很多情况下问及 loadView、viewDidLoad 和 viewDidUnload 三者之间的关系。
这里我们先了解下关于 App 展示的界面有哪些方式。
- 使用
XIB来构建界面 - 使用
Storyboard来构建界面 - 使用 代码来构建界面
界面构造
在构建界面过程中基本的流程是:
(1)系统会首先会加载 XIB 或者是 Storyboard 来初始化界面
(2)在没有 XIB 或者是 Storyboard 情况下加载手写代码实现界面
(3)在有 XIB 或者是 Storyboard 系统也会加载手写代码
XIB 来构建界面
下面来看下使用方式:
1 | UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"name" bundle:nil]; |
上面使用 XIB 进行初始化过程需要指定 XIB 的名字和 bundle 的值。
Storyboard 来构建界面
下面来看下使用方式:
1 | UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"name" bundle:nil]; |
代码来构建界面
在上面我们所列举的 viewDidLoad 里面实现手写代码。
界面构建中 loadView、viewDidLoad 和 viewDidUnload 调用
loadView
loadView 的使用时期一般是第一次加载界面(也即是:View不存在时)调用来对 view 进行加载,如果在函数中没有进行相关的调用系统会默认调用 [super loadView]。
基本的内容是负责创建 UIViewController 中的 View 值。
其中 loadView 中大概执行加载情况如下:
(1)根据 XIB 或者是 Storyboard 来加载视图
1 | // XIB 加载视图 |
(2)如过没有相关的 XIB 或者 Storyboard,使用 ViewController 初始化视图
1 | [[ViewController alloc] init]; |
(3)在没有 没有相关的 XIB 或者 Storyboard时,最后初始化视图的View
1 | self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; |
viewDidLoad
上面三种创建 View 后均会提调用 viewDidLoad,而且在其中我们可以实现对子控件的初始化。
viewDidUnload
如果当前的 App 占用过多的内存就会调用在函数周期的 didReceiveMemoryWarning 继而调用 viewDidUnload 释放当前的 UIViewControler 视图控制器。