牛逼轰轰的产品

记录苦逼的产品培育过程......

简单谈谈UIViewController的回收机制

以前一直不太清楚UIViewController(以下简称C)里的viewDidUnload的用法,今天处理一个内存报警导致C被回收然后白屏的问题时基本明白了它的用意。


顾名思义,viewDidUnload应该是当view被unload后执行的接口。那什么时机下view会被unload呢?C被GC回收时,不会执行这个方法,执行的是NSObject的deallocate。didReceiveMemoryWarning接口里有一行占位的注释:

// Releases the view if it doesn't have a superview.

就是说didReceiveMemoryWarning的默认行为就是把当前不可见的view(准确地说应该是不在内容层级关系里面)给释放掉,一旦释放view,就会触发C的viewDidUnload方法。在模拟器的“硬件”菜单里有“模拟内存警告”,可以非常方便地重现出内存警告的时机,然后观察执行的代码堆栈。(这里需要注意的是,当前可见区域的view永远不会因为内存警告而被自动回收,一旦切换到其它的C,原来的C里的view在被通知到内存警告时就会被回收掉)

一旦C的view被回收,下次再进入这个C时,会再次调用viewDidLoad方法,以方便再次渲染界面。

总结一下,UIViewController的这种内存回收机制(自动回收view,自动重新加载view)非常智能,开发人员只需要关心viewDidLoad和viewDidUnload方法即可,以对称的方式去加载和卸载subviews。另外,更进一步,可以重载didReceiveMemoryWarning方法,把当前正在显示的C中不需要显示的subviews给回收掉(因为当前C正在显示,不会触发viewDidUnload方法)。

评论