关于在iPhone OS设备上管理内存的妖术:不同级别的内存警告是什么意思。1级?2级?拨盘转到11吗?
上下文:经过长时间的内存压力测试-包括在播放iPod音乐播放器应用程序的同时运行我的iPad应用程序,我倾向于忽略收到的随机但很少出现的内存警告。我的应用程序永不崩溃。曾经 我的应用程序无泄漏。而且,内存警告似乎并不重要。
谢谢,
道格
Answers:
基本上,警告表示该设备的内存不足,并且,“如果您可以释放一些内存,则您没有在积极使用该内存! ”。如果您的内存管理很严格,并且您几乎没有可以丢弃的对象,则只需传递消息并忽略它即可。
内存级别警告由SpringBoard记录。作为应用程序开发人员,您无需关心它。仅仅响应-{application}didReceiveMemoryWarning
就足够了。
有4级警告(0到3)。这些是从内核内存监视程序设置的,可以通过不太公开的功能获得OSMemoryNotificationCurrentLevel()
。
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
没有记录如何触发级别。SpringBoard被配置为在每个内存级别中执行以下操作:
终止活动的应用程序(jetsam)不是由SpringBoard处理,而是由处理launchd
。
libsystem_c.dylib
。如果我可以继续使用它,那就太好了。谢谢
/*
** 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提供了几种接收低内存警告的方法,包括以下几种:
如何减少应用程序的内存占用?
如何明智地分配内存?