【问题标题】:iOS Application crashes from memory warning after returning from background, but not before?从后台返回后,iOS应用程序因内存警告而崩溃,但之前没有?
【发布时间】:2012-02-20 06:23:19
【问题描述】:

我有一个奇怪的情况。我有一个内存相当密集的进程(图像处理)正在运行,但我已经解决了所有的问题,它在 99% 的时间里运行得很好。

但是,如果我将应用程序置于非活动或后台状态,当返回并尝试运行同一进程时,我会收到内存警告,然后应用程序崩溃。

我使用仪器分析了两个用例中的内存占用情况,内存占用情况完全相同。但是,在我不将应用程序置于后台(或不活动)的情况下,它不会给我任何内存错误并且可以正常完成。在将其置于后台(或非活动状态)的用例中,出现内存错误并崩溃。

有人知道这方面的信息吗?我一直在搜索 net / irc / stack over / apple docs 试图弄清楚这一点。从后台返回后,Apple (iOS) 是否会减少我的应用程序允许运行的内存量?有什么办法可以防止这种情况发生吗?还是我忽略了其他更简单的解决方案?

(注意,没有内存泄漏)

【问题讨论】:

  • 请将错误信息添加到您的 Q 中。
  • 没有错误信息,因为它是导致崩溃的低内存错误。
  • 在进入或离开前台/退出/变为活动状态时,您是否在您的应用程序委托方法中做任何事情?

标签: iphone objective-c ios memory memory-management


【解决方案1】:

也许您的应用在后台收到内存警告,而您对此的反应是不同的:例如,在后台所有视图控制器都可以在收到内存警告时卸载其内容,但在前台,您的不会卸载活动视图控制器。如果说视图控制器或其对象之一被设置为您的应用程序中不响应低内存警告的其他进程的委托,您最终可能会向已释放的实例发送消息。

在不知道崩溃的详细信息(您真正应该包括的内容)以及有关应用程序结构的更多信息的情况下,这是我的最佳猜测。

【讨论】:

  • 我在后台没有收到任何内存错误,并且在我恢复应用程序时视图都已加载。但是当我在我的应用程序上点击“开始”开始处理图像时,由于内存不足,它会崩溃,但只有在从后台返回后才会崩溃。
  • (我也在和 Spongey 一起工作)是的,问题不在于应用程序在后台崩溃,它很好地回到前台,问题是然后当我们继续使用该应用程序时,由于内存不足,它会崩溃。如果我们执行完全相同的行为,但没有先切换快速应用程序,它可以正常工作,而不是一个警告。
  • 那么您的应用如何响应内存不足警告?你要摆脱什么?
  • 对不起,我们在那里越过了 cmets - 你没有收到任何低内存警告,只是噗!走了?我不确定我是否可以帮助你,那么,我在这方面没有任何经验。
  • @spongey 在模拟器中有一个选项可以在运行你的应用程序时模拟内存警告。检查它在这种情况下是否显示..?
【解决方案2】:

好吧,明白了——iOS 没有做任何愚蠢的事情,当然是开发人员 :) 我的项目中有另一个组件(ViewController)在从后台返回时做了一些事情,例如分配内存。然而,这个视图并不活跃,因此分配它所需的内存被证明是无用的。清理代码后,我没有遇到任何内存错误。

【讨论】:

    【解决方案3】:

    只是为了检查,在启动任何后台进程时,它应该在自动释放池中。后台进程与主线程并行运行。因此,在后台执行任何任务时,我们应该查看内存。这是泄漏时经常发现的常见错误。处理 UIKit 的操作也总是在主线程上运行。因此,如果您通过后台处理任何数据并希望在 UI 上显示它,那么它将在主线程上加载。

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2012-05-28
      • 2013-07-10
      • 1970-01-01
      • 2015-08-16
      • 2011-11-03
      • 2013-10-18
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多