ios - 如何在 iOS 中检测 level=2 内存警告?

标签 ios

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:...查看链接的头文件,看起来它具有 Apple 用来找出当前级别的底层私有(private)函数:“OSMemoryNotificationLevel OSMemoryNotificationCurrentLevel(void)” - 但我想我们无法获得过去的 Apple 提交 :( ?

最佳答案

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

The documentation说:

It is strongly recommended that you implement this method. If your application does not release enough memory during low-memory conditions, the system may terminate it outright.

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

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

关于ios - 如何在 iOS 中检测 level=2 内存警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581226/

相关文章:

ios - 单击 uitableviewcell 时显示更多行

iphone - 向 UILabel 添加背景图像

ios - Objective C 比较 2 张图像并突出显示差异

ios - 如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

iphone - 迁移 iPhone 应用程序中的 sql 数据

ios - 检测两个日期是否在同一日历日内

iphone - 仅适用于 iPhone 的应用程序

ios - 相对于 iOS 中帧的初始引用的电话加速

ios - UIScrollView scrollRectToVisible :animated: not taking rect into account on iOS7

ios - 使用 Urban Airship & Phonegap,无法注册设备 : "Device token is nil"