ios应用UIViewController内存管理


  iOS开发UIViewController内存治理是本文要介绍的内容,在 iOS 3.0 后,UIViewController 多了一个叫做 viewDidUnLoad 的 步骤 。不少人都不清晰这个 步骤的具体 意思,苹果的文档也就一句 ”Called when the controller’s view is released from memory” 方便的解释了下,并要求你把 IBOutlet 绑定的视图给清空,为何呢?

  先看下 UIViewController 从 缔造 view 到 展示的流程的几个函数

  -initWithNibName:bundle:

  这两个 步骤都是初始化一个 vc,但请 留神 view 不是这时候载入的

  -loadView

  -viewDidLoad

  当一个视图 预备 展示时,vc 首先会推断 view 是不是已经 缔造不然便通过之前指定的 xib 文件来初始化 view,以及绑定 其余关系(若没有指定 xib 文件,则默许会查找和 vc 同名的 xib, 比方 myNameViewController 就会查找 myNameViewController.xib 文件)

  若是没有 xib 文件,你就 可以在 loadview 中自己手动 缔造这个 viewControoler 需求的视图 。接下来便是调用到 -viewDidLoad,许多人喜爱在这里做些 其余 事件, 比方做个 http 申请、 构建个数组啥的 。这里若不 解决正确,-viewDidUnload 激活时内存就方便泄露了,稍后提到 。

  -view()appear

  -view()disappear

  这几个 步骤就不解释了

  -viewDidUnload

  该 步骤在收到内存 忠告,同时该视图并不在目前界面显示时候会被调用,此时该 controller 的 view 已经被 开释并赋值为 nil 。

  接下来你要做的是把实例变量的子视图 开释(IBOulet 的,以及自己增加的) 其余实例变量, 比方之前在 -viewDidLoaded 中实例的数据数组、http 申请 开释掉

  由于当该 viewController 再次被激活 预备显示时( 比方 navigationControler 返回到上一级),vc 发现自己的 view 为空后会 反复之前的流程直到把 view 给 缔造起来 。若没将自己额外增加的子视图,各 品种实例变量 开释,这里便会再一次再次 缔造 。

  于是,内存泄露了 。