applicationDidReceiveMemoryWarning中的内存警告级别

时间:2010-08-05 11:54:28

标签: iphone ipad

据我所知,有2级记忆警告。 applicationDidReceiveMemoryWarning没有警告级别。有没有办法获取这些信息?

2 个答案:

答案 0 :(得分:6)

我将此作为一个单独的答案而不是我的另一个,因为它是一个单独的答案。我之前给出的答案是实用的,你应该使用的那个。它归结为“处理你通知的一级记忆警告而不关心细节”。

但是,如果您真的想了解更多信息,请查看此未记录的API:http://www.opensource.apple.com/source/Libc/Libc-594.1.4/include/libkern/OSMemoryNotification.h

这是生成内存警告的内核代码的标头,它声明了以下typedef:

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

我们显然没有使用密钥方法(OSMemoryNotificationCurrentLevel())来实现数学,以说明要返回哪个警告,但这是可能的返回值列表。

您可以使用Mach.h库来测试设备上的实际内存级别(如果您需要某些代码,请告诉我),然后使用OSMemoryNotificationCurrentLevel()获取当前内存级别警告,并真正将通知级别映射到机器的物理状态。这样的应用程序在应用程序商店中是完全不受欢迎的,它在实际开发中不会真正帮助你,你的工作就是响应你收到的单级低内存警告。

答案 1 :(得分:4)

这并不是说有两个级别的警告 - 不是说,“你还有一点记忆”,然后“剩下更少的记忆”。这是同样的“低内存”警告被解雇了两个地方。一旦进入当前在视图中的UIViewController子类(并且,如果该UIVC未实现didReceiveMemoryWarning,那么它将冒泡到视图控制器堆栈的顶部)并再次在{{1}中的应用程序代理上}。一个不是另一个“更糟糕”的警告,它们只是两个不同的钩子,用于实现对操作系统相同警告的响应。

这是平台的一个怪癖,你无法真正知道你可以随时获得多少内存。后台应用程序(邮件,电话等)根据需要吸收尽可能多的RAM,剩下的就是剩下的,而且你知道自己变得太大的唯一方法就是操作系统这么说。

通过放弃您现在不需要的资源来做出适当的回应非常重要。从悬而未决的水果开始 - 你以后要保留的任何大项目。例如,您可以在以后再次需要它时从服务器或磁盘中撤出的图像。