iOS开发中UIViewController的内存管理就是本文要介绍的内容。 iOS 3.0之后,UIViewController多了一个名为viewDidUnLoad的方法。很多人不知道这个方法的具体含义。 Apple 的文档简单地解释说“当控制器的视图从内存中释放时调用”,并要求您清除绑定到IBOutlet 的视图。为什么?
我们先看一下UIViewController从创建视图到显示视图的流程的几个函数。
-initWithNibName:捆绑:
这两种方法都会初始化一个vc,但是请注意,此时视图还没有加载。
-加载视图
-viewDidLoad
当一个视图准备显示时,vc会首先判断该视图是否已经创建,否则会通过之前指定的xib文件初始化该视图,并绑定其他关系(如果没有指定xib文件,则使用相同的xib文件) name as vc 会默认搜索,如myNameViewController 会搜索myNameViewController.xib 文件)
如果没有xib文件,可以在loadview中手动创建这个viewControoler需要的视图。下一步是调用-viewDidLoad。很多人喜欢在这里做其他事情,比如发出http请求、创建数组等,如果处理不好,激活-viewDidUnload时很容易泄漏内存,后面会提到。
-view()出现
-view()消失
我不会解释这些方法。
-viewDidUnload
当收到内存警告并且视图未在当前界面上显示时,将调用此方法。此时控制器的视图已经被释放并赋值为nil。
接下来要做的就是释放实例变量的子视图(IBOUlet 的和自己添加的)和其他实例变量,例如-viewDidLoaded 中前一个实例的数据数组和http 请求。
因为当viewController再次被激活并准备显示时(例如navigationControler返回到上一级),vc发现它的view为空,就会重复之前的过程,直到view创建完成。如果您不释放添加的附加子视图和类实例变量,它们将在此处重新创建。
所以,内存泄露了。