理解view的生命周期:
在UIViewController中,view(黑体的view指的是controller的view属性)有两个循环:加载和卸载循环。当程序的一部分向controller请求view的指针且view不在内存中时,view会进入加载循环,controller会将view加载入内存。
当程序接收到内存警告时,controller会尝试卸载view,在卸载循环中,controller尝试释放它的view对象并返回到原始的无view状态(当它不在屏幕上显示时,这个条件的判断到底是根据view的结构来还是根据用户视觉来,我尚不清楚),直到view下次被请求。
在加载卸载循环中,controller处理的大部分逻辑。但是如果我们的controller还“持有”着view的后代view时,或者还有其他后续操作需要进行时,我们可以重载特定函数(后面会介绍到)来另行处理。
加载循环:
-
程序请求了controller的view.
-
如果view当前不在内存中,controller调用loadview函数。
-
loadView
进行如下操作: -
controller 调用
viewDidLoad
方法来执行一些加载时(加载时一词,相对于编译时、运行时)任务.
程序可以重载loadView
和 viewDidLoad来执行一些任务:
卸载循环:
-
程序收到内存警告.
-
每个view controller调用
didReceiveMemoryWarning
:-
If you override this method, you should use it to release any custom data that your view controller object no longer needs. You should not use it to release your view controller’s view. You must call
super
at some point in your implementation to perform the default behavior.(iOS3.0以后不建议重载这个函数来进行额外的清除操作,使用viewDidUnload) -
默认实现会在确定可以安全地释放view时释放掉view。
-
-
如果controller释放了它的view, 它会调用
viewDidUnload
. .可以重载这个函数来进行额外的清理操作(不要清除view和那些加载循环中无法rebuild的数据)。BTW:didReceiveMemoryWarning到底应该怎么用
当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning
从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。
这个函数的默认实现是:检查controller是否可以安全地释放它的view(这里加粗的view指的是controller的view属性),比如view本身没有superview并且可以被很容易地重建(从nib或者loadView函数)。
如果view可以被释放,那么这个函数释放view并调用viewDidUnload。
你可以重载这个函数来释放controller中使用的其他内存。但要记得调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。
如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在viewDidUnload中释放这些引用。
感谢:http://www.cnblogs.com/Piosa/archive/2012/02/22/2363258.html