我正在向我的应用程序引入自动旋转,并且我遇到了内存警告问题。无论我开始使用哪种方向,只要设备保持该方向,我就不会收到内存警告。但是,第一次旋转设备时,控制台上会出现以下警告:Safari获得了内存级别警告,从而终止了除活动之外的所有文档。当发生这种情况时,除了被查看的视图控制器之外的所有视图控制器都被卸载 - 当导航回通常已经在堆栈上的视图控制器时,这会产生意外的行为。应用程序永远不会崩溃,并且此警告在第一次轮换时发生,之后它永远不会发生(直到我再次停止/启动应用程序)。此外,这只发生在设备上 - 在模拟器中运行时没有内存警告。
有没有人见过这种行为?在任何情况下,是否有人对我可能尝试删除内存警告的内容有任何建议。
提前致谢。
答案 0 :(得分:2)
你不能假设永远不会发生内存警告;你必须优雅地处理它们。建议:
[super didReceiveMemoryWarning]
)。这是懒惰的,如果您的应用程序最终使用太多内存,可能会导致崩溃(Safari和Phone等后台应用程序将首先被杀死。)您可以使用模拟器中的“模拟内存警告”选项测试内存警告行为。
答案 1 :(得分:0)
由于内存有限,内存警告是正常iOS行为的一部分,特别是现在支持多任务处理。
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/