iPhone旋转会导致内存警告

时间:2010-05-24 21:09:50

标签: iphone autorotate

我正在向我的应用程序引入自动旋转,并且我遇到了内存警告问题。无论我开始使用哪种方向,只要设备保持该方向,我就不会收到内存警告。但是,第一次旋转设备时,控制台上会出现以下警告:Safari获得了内存级别警告,从而终止了除活动之外的所有文档。当发生这种情况时,除了被查看的视图控制器之外的所有视图控制器都被卸载 - 当导航回通常已经在堆栈上的视图控制器时,这会产生意外的行为。应用程序永远不会崩溃,并且此警告在第一次轮换时发生,之后它永远不会发生(直到我再次停止/启动应用程序)。此外,这只发生在设备上 - 在模拟器中运行时没有内存警告。

有没有人见过这种行为?在任何情况下,是否有人对我可能尝试删除内存警告的内容有任何建议。

提前致谢。

2 个答案:

答案 0 :(得分:2)

你不能假设永远不会发生内存警告;你必须优雅地处理它们。建议:

  • 检查泄漏是否有内存泄漏(请注意,它没有发现所有泄漏)。
  • 修复视图控制器以处理视图重新加载。具体来说(除非你覆盖 - (void)loadView),它会在内存警告上调用 - (void)viewDidUnload,并且当它再次可见时调用 - (void)viewDidLoad。您可以通过在视图控制器中保存状态并将其还原到 - (void)viewDidLoad中的视图来解决此问题。
  • 如果您无法处理内存警告,请执行 - (void)didReceiveMemoryWarning并且不要超级调用(即注释掉[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/