https://blog.csdn.net/wangyanchang21/article/details/50730902
1)当应用可用内存过低导致系统发出内存警告的时候,便会触发此方法。
(2)清除不需要的视图,满足以下两个条件:1.视图已经被创建 2.不需要在 window 上显示了
(3)当从写此方法时,需要调用父类。调用super的didReceiveMemoryWarning只是释放controller的resouse,不会释放view。
(4)具体过程:当系统内存不足时,首先UIViewController的didReceiveMemoryWarining 方法会被调用,而didReceiveMemoryWarining 会判断当前ViewController的view是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarining 会自动将viewcontroller 的view以及其所有子view全部销毁,然后调用viewcontroller的viewdidunload方法。如果当前UIViewController的view显示在window上,则不销毁该viewcontroller的view,当然,viewDidunload也不会被调用了。
作者:DCSnail-蜗牛
来源:CSDN
原文:https://blog.csdn.net/wangyanchang21/article/details/50730902
版权声明:本文为博主原创文章,转载请附上博文链接!
一个App 有 3个 tab,A 、B、C。(都从viewController继承,并且都实现了didReceiveMemoryWarning)。当程序启动的时候,默认显示tab A,这个时候,A 的 viewDidload被调用,并且加载数据显示给用户。然后我们切换到 tab B,B会重复A的加载过程。
这时候系统产生了一个内存警告,A、B、C 3个对象都会受到警告。
A对象:因为它已经不在当前UI显示了,所以满足[self.view window] == nil,相关view被释放。
B对象:正在显示,所有didReceiveMemoryWarning什么也不会干。
C对象:最悲惨,从来没有显示过,viewDidload从来没调用过,也没有显示过。然后有个self.view .这句的调用会导致一个结果,就是C对象的viewDidload会被调用一次,于是他的逻辑就是释放前先创建一次,然后再把自己释放,是不是很悲剧。(所以apple给的方案也不一定完美靠谱)
作者:DCSnail-蜗牛
来源:CSDN
原文:https://blog.csdn.net/wangyanchang21/article/details/50730902
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论