关于在iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么。 1级? 2级?表盘是否转到11?
背景:经过大量的内存压力测试期 - 包括在播放iPod音乐播放器应用程序时运行我的iPad应用程序,我倾向于忽略我收到的随机但不常见的内存警告。我的应用从不崩溃。永远。我的应用程序是无泄漏的。而且,mems警告似乎并不重要。
谢谢,
道格
答案 0 :(得分:193)
SpringBoard记录了内存级警告。作为应用程序开发人员,您无需关心它。只需回复-{application}didReceiveMemoryWarning
即可。
有4级警告(0到3)。这些是从内核内存观察器设置的,可以通过not-so-public function OSMemoryNotificationCurrentLevel()
获得。
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
未记录触发级别的方式。 SpringBoard配置为在每个内存级别执行以下操作:
杀死活动应用程序(jetsam)不是由SpringBoard处理,而是launchd
。
答案 1 :(得分:96)
基本上警告意味着设备在内存上运行不足,并且“如果你可以请释放一些你没有积极使用的内存,那就是膨胀!< /强>”。如果你的内存管理很紧张,并且没有任何实际可以丢弃的对象,只需传递消息并忽略它。
答案 2 :(得分:12)
/*
** Threshold values for notifications
*/
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
totoal 5级内存警告(-1,3)。
关于内存级警告说明,@ KennyTM的答案非常好。
我想补充一些可能有助于PM和其他人的相关要点。
内存级别警告时应该怎么做?
收到任何这些警告后,您的处理程序方法应立即释放任何不需要的内存。例如,如果该视图当前不可见,则UIViewController类的默认行为是清除其视图;子类可以通过清除其他数据结构来补充默认行为。维护图像缓存的应用程序可能会通过释放当前不在屏幕上的任何图像来响应。
如何观察记忆级警告?
当系统向您的应用发送内存不足警告时,请立即响应。只要可用内存量低于安全阈值,iOS就会通知所有正在运行的应用程序。 (它不会通知已暂停的应用。)如果您的应用收到此警告,则必须释放尽可能多的内存。执行此操作的最佳方法是删除对高速缓存,图像对象以及稍后可以重新创建的其他数据对象的强引用。
UIKit提供了几种接收内存不足警告的方法,包括:
如何减少应用内存占用空间?
如何明智地分配内存?