当前位置:  开发笔记 > IOS > 正文

iOS:didReceiveMemoryWarning的乐于助人:

如何解决《iOS:didReceiveMemoryWarning的乐于助人:》经验,为你挑选了3个好方法。

我正处于开发过程中,用于跟踪崩溃和内存泄漏.作为一种策略,您是否将任何NSLog消息或某些此类消息通知didReceiveMemoryWarning:?此方法的文档相当稀疏.是否准确地说在发生崩溃之前,UIViewController将触发该方法?这是甚至在推进仪器之前的起点吗?



1> Airsource Lt..:

好的,有几点需要注意:

didReceiveMemoryWarning将在内存不足崩溃之前被调用.不是其他崩溃.如果正确处理警告并释放内存,则可以避免内存不足而不会崩溃.

您可以在"硬件"菜单下的模拟器中手动触发内存警告.强烈建议这样做来测试你对didReceiveMemoryWarning的处理.

仪器可以帮助您调试泄漏(尽管不是全部) - 它对于崩溃并不是那么有用.

不,我个人不使用NSLog - 我只是在调试时断开内存警告.



2> Rhythmic Fis..:

更新 从iOS 6开始,UIViewController不再卸载视图以响应内存警告.相反,只要尽力释放您可以合理重新创建的任何资源(例如缓存数据)didReceiveMemoryWarning.

更新
当我是一个愤怒的年轻人时,我写了我的原始答案; 时代已经改变,基本上,这是错误的.

如果您的应用程序具有单个视图控制器并且您收到内存警告,那么您无能为力.但是,如果您有多个视图控制器,情况会发生巨大变化,因为您可以卸载与非最前端控制器关联的所有状态.事实上[UIViewController didReceiveMemoryWarning],通过为您卸载不可见的视图,可以使您朝着正确的方向前进(惊喜!).当最前面的视图控制器被关闭时,底层视图被重新加载,并且用户应该只知道延迟,即使内部您的应用程序可能已完成重新启动.

这不是您可以轻松改造的一些细节,您需要从头开始记住内存使用情况,并将多视图应用程序设计为干净无法卸载的UIViewController部分.实际上,为了使用其内存警告功能,保持代码与模拟器兼容是值得的.

当内存充足时,没有任何东西被卸载,一切都是丝滑的,当内存不足时,东西会继续工作,尽管速度会更慢.现在我要说这种有限内存问题的解决方案是理想的.

要利用这个内存客厅技巧,重载UIViewController方法 viewDidLoad,viewDidUnloadviewWillUnload(iOS5,如果卸载状态需要你的视图仍然存在,如果你不想泄漏你的OpenGL纹理和渲染缓冲区,在iOS4你可以模拟通过重载didReceiveMemoryWarning和跟踪视图的可见性来实现这一点.

原始,更多的双语回答

didReceiveMemoryWarning 绝对没用.

如果你释放内存(甚至全部内存),就不能保证你不会被杀死.

在我的痛苦经历中,它通常在2.x/3.0上运行如下:

    mediaserverd泄漏了一堆内存

    我的应用程序被杀了

不幸的是,收割者从未想过杀死mediaserverd.

因此,如果内存使用不是你的错,你真的只有两个选择:

    要求用户重启(用户认为这是你的错,写了一篇严厉的评论)

    希望罪魁祸首崩溃(mediaserverd经常要求!)



3> 小智..:

如果用户打开了一些应用程序,您将拥有的内存非常少.因此有时didReceiveMemoryWarning只有在使用1 MB后才能被系统调用.

系统在所有视图控制器上调用此方法,如果在每个视图控制器中放置NSLog,您会注意到这一点.

然后系统viewDidUnload将自动在所有视图控制器上调用该方法(不是dealloc).因此,您必须将所有释放指令放在那里.

您必须进行大量实验,因为如果您的应用程序很复杂,那么在管理它之前您将面临很多崩溃.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有