iPhone - 如何处理低内存条件

时间:2012-01-22 13:49:23

标签: iphone objective-c memory-management didreceivememorywarning viewdidunload

当应用收到内存不足警告消息时,可能会发生以下三种情况:

  1. 您的应用刚刚启动且用户没有做任何特别的事情
  2. 该应用正在运行并且存在当前上下文
  3. 应用程序在后台有一些运行上下文
  4. 所以当你收到这条消息时,你应该释放记忆......但是在哪里?怎么样?

    我理解:

    1. initWith .....必须设置默认静态值。
    2. viewDidLoad必须加载任何非静态对象
    3. didReceiveMemoryWarning必须释放这些非静态对象
    4. 我不知道在viewDidUnload ...
    5. 中可以/必须做些什么

      我想某些保留值必须设置为nil某处...在didReceiveMemoryWarning中?

      对于活动上下文(屏幕内容,显示的文本,......)必须做些什么,所以当再次调用viewDidLoad时,那些东西会再次出现在memoryWarning调用之前的位置?

      我的意思是,想象两个场景:

      情景1

      1. 你正在做某事......你在一个字段中写了一些文字,没有保存,打开另一个视图,在屏幕上移动了一个视图。
      2. 您在后台发送应用程序。
      3. 然后将内存警告发送到应用程序。
      4. 之后,用户将应用程序发送到前台:它应该显示退出时的内容,在当前视图中显示与先前视图相同的内容,但如果所有内容都已发布,您可以如何执行此操作?
      5. 场景2

        1. 你正在做某事......你在一个字段中写了一些文字,没有保存,打开另一个视图,在屏幕上移动了一个视图。
        2. 然后将内存警告发送到应用程序。
        3. 您不想放松视图中的内容,也不想放弃上一个视图中的内容。由于发布/重新加载功能,您不希望屏幕闪烁。你怎么处理这个?
        4. 因此,当发生这些内存警告时,除了将内容写入磁盘以便稍后显示之外,您还有其他选择吗?

          你什么时候再装这些?我有一个viewController加载(viewDidLoad),接收一个memoryWarning,unloads(viewDidUnload),但回到它时,viewDidLoad不再被调用?这是否必须在viewWillAppear中完成?我是否必须认为无论何时触发viewWillAppear,我都可以假设应该在其上显示的内容被加载?

          任何帮助,即使有价值的链接,都会很棒!

          感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我的想法是,当应用收到内存不足警告时会调用两个方法:

didReceiveMemoryWarning // in your NSObjects

applicationDidReceiveMemoryWarning // in your app delegate

然后,如果你想释放内存,这些是需要考虑的方法。

关于你在那里可以做些什么......好吧...... 想想Xcode建议的内容:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    /*
     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
     */
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

看起来,最好的选择是释放用户未看到和/或未使用的任何对象,或者以后可以重新创建的任何缓存数据。 不要触摸您的GUI:如果您关闭它或部分GUI,您的应用程序将变得无法使用,并且用户会感到失望。

关于你的2个场景,我发现在考虑内存警告时可能存在错误。 它们是一种治疗紧急情况的方式,而不是管理记忆的常用方法。 开发人员必须考虑良好的内存架构并尽可能保存数据。

在方案1中,将应用程序发送到后台时保存数据。

applicationDidEnterBackground

在方案2中,在打开新视图时保存数据。

希望这是有道理的......

答案 1 :(得分:1)

考虑您的方案的替代方案。如果它没有释放足够的内存,你的应用程序可能会被杀死,这对用户来说会更加不和谐。人们可能会选择潜在的闪烁当前显示而不是丢失用户的宝贵数据。