applicationDidReceiveMemoryWarning中的内存警告级别

use*_*305 4 iphone ipad

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

Dan*_*Ray 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;
Run Code Online (Sandbox Code Playgroud)

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

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


Dan*_*Ray 5

并不是说有两个级别的警告——不是像“你还剩下一点内存”和“你剩下的内存更少”之类的。这是相同的“低内存”警告在两个地方被触发。一旦在当前视图中的 UIViewController 子类上(并且,如果该 UIVC 没有实现didReceiveMemoryWarning,那么它将冒泡到视图控制器堆栈的顶部)并再次在applicationDidReceiveMemoryWarning. 一个不是比另一个“更糟糕”的警告,它们只是两个不同的钩子,用于实现对来自操作系统的相同警告的响应。

这是该平台的怪癖之一,您无法真正知道随时可用的内存量。后台应用程序(邮件、电话等)会根据需要占用尽可能多的 RAM,剩下的留给您去解决,而您知道自己变得太大的唯一方法就是操作系统这么说时。

通过放弃您现在不需要的资源,做出适当的回应很重要。从低垂的果实开始——任何你留待以后做的大事。例如,您可以丢弃这些图像,然后在您再次需要它们时从服务器或磁盘中提取。