iPhone OS内存警告。不同级别意味着什么?

时间:2010-05-26 17:16:26

标签: memory-management ipad warnings

关于在iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么。 1级? 2级?表盘是否转到11?

背景:经过大量的内存压力测试期 - 包括在播放iPod音乐播放器应用程序时运行我的iPad应用程序,我倾向于忽略我收到的随机但不常见的内存警告。我的应用从不崩溃。永远。我的应用程序是无泄漏的。而且,mems警告似乎并不重要。

谢谢,
道格

3 个答案:

答案 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配置为在每个内存级别执行以下操作:

  1. 警告(非正常) - 重新启动或延迟非必要背景应用的自动重新启动,例如邮件。
  2. 紧急 - 退出所有后台应用,例如Safari和iPod。
  3. 关键和超越 - 内核将接管,可能会杀死SpringBoard甚至重启。
  4. 杀死活动应用程序(jetsam)不是由SpringBoard处理,而是launchd

答案 1 :(得分:96)

基本上警告意味着设备在内存上运行不足,并且“如果你可以请释放一些你没有积极使用的内存,那就是膨胀!< /强>”。如果你的内存管理很紧张,并且没有任何实际可以丢弃的对象,只需传递消息并忽略它。

答案 2 :(得分:12)

来自OSMemoryNotification.h

/*
** Threshold values for notifications
*/

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

totoal 5级内存警告(-1,3)。

关于内存级警告说明,@ KennyTM的答案非常好。

我想补充一些可能有助于PM和其他人的相关要点。


内存级别警告时应该怎么做?

收到任何这些警告后,您的处理程序方法应立即释放任何不需要的内存。例如,如果该视图当前不可见,则UIViewController类的默认行为是清除其视图;子类可以通过清除其他数据结构来补充默认行为。维护图像缓存的应用程序可能会通过释放当前不在屏幕上的任何图像来响应。


如何观察记忆级警告?

来自http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

当系统向您的应用发送内存不足警告时,请立即响应。只要可用内存量低于安全阈值,iOS就会通知所有正在运行的应用程序。 (它不会通知已暂停的应用。)如果您的应用收到此警告,则必须释放尽可能多的内存。执行此操作的最佳方法是删除对高速缓存,图像对象以及稍后可以重新创建的其他数据对象的强引用。

UIKit提供了几种接收内存不足警告的方法,包括:

  • 实施应用的applicationDidReceiveMemoryWarning:方法 委托。
  • 覆盖自定义中的didReceiveMemoryWarning方法 UIViewController子类。
  • 注册接收 UIApplicationDidReceiveMemoryWarningNotificationnotification。

如何减少应用内存占用空间?

  • 消除内存泄漏。
  • 使资源文件尽可能小。
  • 将Core Data或SQLite用于大型数据集。
  • 懒洋洋地加载资源。
  • 使用Thumb选项构建程序。

http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

的详细信息

如何明智地分配内存?

  • 减少对自动释放对象的使用:具有自动引用功能 计数(ARC),最好是alloc / init对象并让它 编译器会在适当的时候为您发布它们。这是真的 即使是过去你可能拥有的临时物品 自动释放,以防止他们超越范围 现行法。
  • 对资源施加大小限制:避免加载大型资源文件 当一个较小的人会这样做。而不是使用高分辨率图像, 使用适合基于iOS设备的大小。如果你 必须使用大型资源文件,找到只加载部分的方法 您在任何给定时间所需的文件。例如,而不是 将整个文件加载到内存中,使用mmap和munmap函数 将部分文件映射到内存中。更多 有关将文件映射到内存的信息。
  • 避免无限制的问题集:可能需要无限制的问题集 要计算的任意大量数据。如果设置需要 内存比可用内存多,您的应用可能无法完成 计算。您的应用应尽可能避免此类设置 处理已知内存限制的问题。