关于管理iPhone操作系统设备内存的黑科技:不同级别的内存警告意味着什么。一级?二级?表盘上会到达11吗?
背景:经过长时间的内存压力测试期后,包括在我的iPad应用程序运行iPod音乐播放器应用程序时,我倾向于忽略偶尔收到的随机内存警告。我的应用程序从未崩溃。它没有泄漏。而且,好吧,内存警告似乎并不重要。
谢谢,
道格
关于管理iPhone操作系统设备内存的黑科技:不同级别的内存警告意味着什么。一级?二级?表盘上会到达11吗?
背景:经过长时间的内存压力测试期后,包括在我的iPad应用程序运行iPod音乐播放器应用程序时,我倾向于忽略偶尔收到的随机内存警告。我的应用程序从未崩溃。它没有泄漏。而且,好吧,内存警告似乎并不重要。
谢谢,
道格
SpringBoard会记录内存警告。作为应用程序开发人员,您不需要过多关注它。只需响应 -{application}didReceiveMemoryWarning
即可。
内存警告分为4个级别(0到3级)。这些警告是从内核内存监视器设置的,并可以通过非公开函数OSMemoryNotificationCurrentLevel()
获得。
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
这些级别是如何触发的并没有记录。SpringBoard 在每个内存级别中做以下配置:
结束活动应用程序(jetsam)不由 SpringBoard 处理,而是由 launchd
处理。
基本上,这些警告意味着 设备 内存不足,并且,"如果您可以请释放一些您没有在使用的内存,那就太好了!"。如果您的内存管理很紧,且您没有可以实际丢弃的对象,只需将消息传递并忽略它。
/*
** Threshold values for notifications
*/
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
总共有5个内存警告级别(-1,3)。
@KennyTM的回答非常好,关于内存警告级别的描述。
我想补充几点相关内容,可以帮助PM和其他人。
在内存级别警告时应该怎么做?
收到任何这些警告后,您的处理程序方法应立即释放任何不必要的内存。例如,UIViewController类的默认行为是在其视图未当前可见时清除其视图;子类可以通过清除其他数据结构来补充默认行为。保留图像缓存的应用程序可能会释放任何当前不在屏幕上的图像。
如何观察内存级别警告?
当系统向您的应用程序发送低内存警告时,请立即响应。iOS在可用内存量降至安全阈值以下时通知所有正在运行的应用程序。 (它不会通知已挂起的应用程序。)如果您的应用程序收到此警告,它必须尽可能释放内存。最好的方法是删除对缓存、图像对象和其他可重新创建的数据对象的强引用。
UIKit提供了几种接收低内存警告的方法,包括以下内容:
如何减少您的应用程序的内存占用?
如何明智地分配内存?
libsystem_c.dylib
中定义的。如果我可以继续使用它,那就太好了。谢谢。 - focs