现在的位置: 首页 > 综合 > 正文

再谈ViewController的生命周期

2019年10月01日 ⁄ 综合 ⁄ 共 1290字 ⁄ 字号 评论关闭

对于一个ViewController对象,对其view的管理分为两个部分:load and unload cycles,当你的应用程序需要ViewController的view并且其view不在内存中时,开始load cycle。这时,ViewController将view加载到内存中,并且将该view存储到其属性view中。

当应用程序收到内存警告时,ViewController可能会unload其view,在unload cycle中,ViewController会尝试释放其view使其回到最初的初始化状态(无视图状态)。如果能够释放view,那么这个ViewController仍然保持没有视图对象直到应用程序又对ViewController的view发起请求,这时ViewController的load cycle重新开始。

load cycle的步骤如下:

1.  当ViewController的属性view被访问并且view没有在内存中时,load cycle开始。

2. ViewController调用 loadView 方法,loadView 的默认操作是执行下面两件事中的其中一个:

如果ViewController与storyboard相关联,那么ViewController从storyboard加载视图

如果ViewController不与storyboard相关联,那么ViewController会创建一个空的UIView对象并且与其属性view相关联

3. ViewController调用 viewDidLoad方法允许子类进行额外的加载工作

下图展现的就是ViewController 的 loadCycle,你可以根据需要重载 loadView 和 viewDidLoad 方法来进行视图控制。比如说当ViewController不与storyBoard相关联时,你可以重写 loadView 用代码来进行额外的视图加载。



unload cycle 的步骤如下:

1. app收到系统发出的内存警告信息

2. 每个ViewController调用didReceiveMemoryWarning方法,如果重写该方法,你应该释放ViewController不需要的内存和对象,不要用它来释放ViewController的属性view,你应该调用该方法的 super 方法来执行默认的操作,在默认的操作中它会尝试释放ViewController的view

3. 当ViewController的view当前正显示时,ViewController的view不会被释放

4. ViewController调用 viewWillUnload方法通知子类views即将被移除,在这些views被移除之前,子类会重写viewDidUnload方法来保存views的属性

5. 设置ViewController 的 属性view 为 nil

6. ViewController调用 viewDidUnload方法通知子类views已经被移除,子类通常在该方法中使这些views的引用置为nil

下图展示的就是ViewController 的 unload cycle:


抱歉!评论已关闭.