0

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

有没有人见过这种行为?无论如何,有没有人对我可以尝试什么以消除内存警告有任何建议。

提前致谢。

4

2 回答 2

2

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

  • 使用 Leaks 检查内存泄漏(请注意,它不会捕获所有泄漏)。
  • 修复您的视图控制器以处理视图重新加载。具体来说(除非您覆盖 -(void)loadView),它会在内存警告时调用 -(void)viewDidUnload 并在再次可见时调用 -(void)viewDidLoad。您可以通过在视图控制器中保存状态并将其恢复到 -(void)viewDidLoad 中的视图来解决此问题。
  • 如果您不介意处理内存警告,请实施 -(void)didReceiveMemoryWarning 并且不要超级调用(即注释掉[super didReceiveMemoryWarning])。这是懒惰的,如果您的应用程序最终使用太多内存,可能会导致崩溃(Safari 和 Phone 等后台应用程序将首先被杀死)。

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

于 2010-05-24T21:23:00.423 回答
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/

于 2010-12-01T04:02:57.713 回答