2010-05-24 105 views
0

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

有没有人看到这种行为?在任何情况下,没有人有任何建议,我可能会尝试删除内存警告。

在此先感谢。

回答

2

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

  • 检查与泄漏内存泄漏(注意它没有捕获所有泄漏)。
  • 修复您的视图控制器以处理视图重新加载。特别是(除非你重写 - (void)loadView),它会在内存警告时调用 - (void)viewDidUnload,当它再次变为可见时,它将调用 - (void)viewDidLoad。您可以通过在视图控制器中保存状态并将其恢复到 - (void)viewDidLoad中的视图来解决此问题。
  • 如果您不能处理内存警告,请执行 - (void)didReceiveMemoryWarning并且不要超级调用(即注释掉[super didReceiveMemoryWarning])。这是懒惰的,如果你的应用程序使用了太多的内存(像Safari和Phone这样的后台应用程序会先被杀掉),可能会导致崩溃。

您可以使用模拟器中的“模拟存储器警告”选项来测试存储器警告行为。

0

由于内存有限,内存警告是iOS正常行为的一部分,尤其是现在多任务支持。

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

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

当系统内存不足时,它会触发didReceiveMemoryWarning。出现内存警告时,离屏视图将被回收并释放,但屏幕视图不会被释放 - 它是可见的并且是需要的。如果你的类拥有大量内存,比如缓存,图像等,didReceiveMemoryWarning是你应该清除它们的地方,即使它们在屏幕上。否则,您的应用程序可能会因为系统资源过剩而终止。您需要重写此方法以确保清理内存;只记得你打电话给[超级didReceiveMemoryWarning];。

更详细的解释可以在这里找到:http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/