【问题标题】:How to detect a level=2 memory warning in iOS?如何在 iOS 中检测 level=2 内存警告?
【发布时间】:2011-09-28 09:41:27
【问题描述】:

Apple 将 lev=1 和 lev=2 内存警告定义为非常不同(一个是“嗯。内存不多。小心点”,另一个是“我要杀死一个进程,你有 5 个...... 4 ... 3 ...")

...但是您如何以编程方式找出您收到了哪一份?

我有一个 iPad 应用程序,它使用专业工具处理图像,并且 lev=1 内存警告是不可避免的 - 即使处理小块图像,它仍然会占用大量内存来显示所有 GUI 等。

我总是得到 lev=1,我对此无能为力。

lev=2 内存警告是完全不同的事情。如果我得到一个 lev=2 这通常意味着有一些后台应用程序占用了大量内存,或者用户所做的某事导致内存膨胀——我需要采取紧急措施来防止我被杀。有些事情我可以做 - 但所有这些都对用户不利(例如,删除所有 GUI,等待几秒钟,然后重新加载)。

所以...我在“didRecieveMemoryWarning”中需要两个不同的代码路径:一个用于 lev=1 警告,一个用于 lev=2 警告。

编辑:有关警告级别的一些信息:iPhone OS Memory Warnings. What Do The Different Levels Mean?

注意:Apple 经常“不记录”事情。如果我们作为开发人员只坚持记录的信息和 API 的无错误部分,那么许多(大多数?)边界推动应用程序将在以后的几个 iOS 版本之前不存在。相反,我们会解决这些错误,并找出 Apple 未能记录的实际发生的情况。

EDIT2: ...查看链接的头文件,看起来苹果使用底层私有函数来找出当前的级别:“OSMemoryNotificationLevel OSMemoryNotificationCurrentLevel(void)” - 但我想我们不可能得到过去的 Apple 提交 :( ?

【问题讨论】:

    标签: ios


    【解决方案1】:

    我不认为警告级别对应用程序可用,但是——我知道这不是你想听到的——这并不重要。仅仅因为操作系统有两个不同级别的内存警告并不意味着您应该在每个级别上做不同的事情并希望其他应用程序做正确的事情。

    The documentation 说:

    强烈建议您实现此方法。如果你的 应用程序在低内存期间没有释放足够的内存 条件下,系统可能会直接终止它。

    没有“小心”或“即将杀人”的说法。 可能是当前发生的情况,但在 iOS5 中是否相同?还是在以后的版本中?做出这种假设是非常危险的。

    我认为您需要考虑优化内存使用。几乎总有一种方法可以优化图像、释放缓存/中间数据、更有效地使用自动释放池、更小/更有效的数据结构。你没有说你目前正在使用什么技术,所以很难具体说明。

    【讨论】:

    • 另外,你可以很确定,如果它是一个占用太多内存的后台应用程序,操作系统宁愿杀死后台的应用程序而不是你的。
    • “这可能是目前发生的情况,但在 iOS5 中是否也是如此?或者在更高版本中?做出这种假设是非常危险的。” - 没有帮助。这IS会发生什么。 iOS 5 做什么或不做什么是无关紧要的——保证现在很烂。我希望它“不烂”。如果它现在可以正常工作,并且在 iOS 5 上效果不佳,那将比替代方案更好 - 对一切都不好!
    • “我认为你需要考虑优化你的内存使用。” - 如果问题有问题,请指出。我试图澄清这一点:没有地方可以减少内存 - 这实际上是不可能的:必须渲染所有正在渲染的东西。一切都已经经过仔细的内存管理,并且仅在需要时才加载-小块,不少于。唯一的选择是让屏幕空白,然后停止应用程序。为了说明这一点,我们正在实时处理 2 GB 的源数据。无论做什么,都需要内存。
    • 我不确定你想让人们说什么。操作系统说你使用了太多内存,但你说你需要它。这两个人中只有一个会赢得这场战斗,而不是你。您不会停止 Mail 的运行;你会找到运行 Skype 的人;你会发现那些已经越狱他们的手机并且几乎没有多余内存的人。也许您需要一种“降级”模式,在内存较少的机器上显示较少的图形?我不知道。但我知道以您建议的方式“欺骗”iOS 效果不佳。
    • 顺便说一句,这里的核心问题 - 可以说 - 是 Skype 和 Mail 是破坏 iOS 多任务处理的病态应用程序(可以说不是他们的错 - 他们遵循 Apple 的规范)。当它们进入后台时,它们都不会离开 RAM - 我相信这是 Apple 用于网络连接的后台代码中的一个缺陷:因为这两个应用程序都请求“保持我的网络连接运行”,它们会得到 force-stay-in-RAM 。 .. 所以,理想情况下:Apple 将更改操作系统实现......和/或:Apple 将对请求保持网络连接运行的标志施加更严格的限制。棘手的问题!
    【解决方案2】:

    我没有尝试过但可能有效的替代方法:捕获 Apple 系统记录器 (ASL) 的输出,查找 lev2 警告字符串。

    假设 Apple 实际上正在使用 ASL(可能不是!),您可以尝试按照此处的说明操作:http://www.cocoanetics.com/2011/03/accessing-the-ios-system-log/ - 它展示了如何使用 Apple 公共 API 访问 ASL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2012-04-22
      • 2016-03-17
      • 1970-01-01
      • 2011-03-07
      • 2014-12-24
      相关资源
      最近更新 更多