iPhone内存警告指南

时间:2010-10-12 06:28:41

标签: iphone objective-c

如果您收到内存警告,是否有任何具体的指导原则?我知道你必须尝试杀死不需要的对象,但如果这使你的应用程序无法运行,还有其他选择吗?

例如,如果应用程序是Apple的联系人应用程序,并且用户正在编辑某人的联系人详细信息。你能做什么?停止编辑?关闭并跳转到列表屏幕?

非常感谢任何建议或指导。

3 个答案:

答案 0 :(得分:2)

如果你的应用程序在前台并且需要它当前分配的所有内存以提供良好的用户体验,那么一个完全合理的选择是在获得内存警告后什么都不做,并希望操作系统杀死或内存挨饿一些其他过程。

但是,如果您的应用程序不那么幸运,至少可以保存重要状态可能是一个好主意。

答案 1 :(得分:2)

他们不会指定你需要释放多少...你只是破坏你能够重建的东西(例如那些在屏幕外的东西)。不要窃取/破坏用户正在看的东西。最终,如果需要资源,系统可能会终止您的应用程序。我只是采取这种方法:如果在屏幕外,清除中等+大量的可以在用户导航回到该屏幕时重建,并尝试保持较低的内存消耗 - 测量您在测试运行中使用的量。

答案 2 :(得分:2)

关于视图控制器的视图管理和内存警告:

UIKit不仅允许从视图控制器返回导航,还允许从现有视图控制器导航到其他视图控制器。在这种情况下,将分配一个新的UIViewController,然后加载到视图中。旧视图控制器将离开屏幕并变为非活动状态,但仍拥有许多对象 - 一些位于自定义属性和变量中,另一些位于视图属性/层次结构中。新的可见视图控制器在视图对象方面也是如此。

由于移动设备的内存容量有限,拥有两组对象 - 一组在屏幕外视图控制器中,另一组在屏幕视图控制器中 - 可能要处理得太多。如果UIKit认为有必要,它可以回收一些屏幕外视图控制器的内存,无论如何都没有显示; UIKit知道哪个视图控制器在屏幕上,哪个是屏幕外的,毕竟它是管理它们的人(当你调用presentModalViewController:animated:或dismissModalViewControllerAnimated :)时。因此,每次感到压力时,UIKit都会生成一个内存警告,从视图层次结构卸载并释放屏幕外视图,然后调用自定义viewDidUnload方法为您的属性和变量执行相同的操作。 UIKit自动发布self.view,然后允许我们在viewDidUnload代码中手动释放变量和属性。它适用于所有屏幕外视图控制器。

当系统内存不足时,它会触发didReceiveMemoryWarning。屏幕外视图将在内存警告时回收和释放,但您的屏幕视图将不会被释放 - 它是可见且需要的。如果您的类拥有大量内存,例如缓存,图像等,didReceiveMemoryWarning就是您应该清除它们的地方,即使它们在屏幕上也是如此;否则,您的应用可能会因系统资源过剩而被终止。你需要覆盖这个方法,以确保你清理你的记忆;只记得你打电话给[super didReceiveMemoryWarning];。

此处提供了更详细的解释:http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/