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

dug*_*gla 85 warnings memory-management ipad

关于在iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么.1级?2级?拨号盘是11吗?

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

谢谢,
道格

ken*_*ytm 193

SpringBoard记录内存级别警告.作为应用程序开发人员,您无需关心它.只是回应-{application}didReceiveMemoryWarning就足够了.


有4个级别的警告(0到3).这些是从内核内存观察器设置的,可以通过不那么公共的功能获得OSMemoryNotificationCurrentLevel().

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;
Run Code Online (Sandbox Code Playgroud)

没有记录如何触发级别.SpringBoard配置为在每个内存级别执行以下操作:

  1. 警告(非正常) - 重新启动或延迟自动重启非必要的后台应用程序,例如Mail.
  2. 紧急 - 退出所有后台应用程序,例如Safari和iPod.
  3. 关键和超越 - 内核将接管,可能会杀死SpringBoard甚至重启.

杀死活动应用程序(jetsam)不是由SpringBoard处理,而是launchd.

  • @srik:你最好[问一个新问题](http://stackoverflow.com/questions/ask). (9认同)
  • @srik:使用更少的内存. (3认同)

Wil*_*and 98

基本上警告意味着设备内存不足,并且"如果你可以请你释放一些内存,你就不会主动使用它了! ".如果您的内存管理很紧,并且您没有可以实际丢弃的对象,只需传递消息并忽略它.

  • 大声笑"如果你能释放一些你没有积极使用的记忆,那就会膨胀!" 无价的;-)干杯 (25认同)
  • 你听起来像是iPhone OS wack-a-mole记忆舞蹈的老手. (15认同)

Md *_*man 12

OSMemoryNotification.h,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

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


如何观察记忆水平警告?

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

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

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

  • 实现appdate的applicationDidReceiveMemoryWarning:方法.
  • 覆盖自定义UIViewController子类中的didReceiveMemoryWarning方法.
  • 注册以接收UIApplicationDidReceiveMemoryWarningNotificationnotification.

如何减少应用程序的内存占用?

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

有关详细信息,请访问http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


如何明智地分配内存?

  • 减少对自动释放对象的使用:使用自动引用计数(ARC),最好分配/ init对象,让编译器在适当的时候为您释放它们.即使对于过去您可能已自动释放的临时对象也是如此,以防止它们超出当前方法的范围.
  • 对资源施加大小限制:避免在较小资源文件时加载大型资源文件.而不是使用高分辨率图像,使用适合基于iOS的设备大小的图像.如果必须使用大型资源文件,请找到在任何给定时间仅加载所需文件部分的方法.例如,不是将整个文件加载到内存中,而是使用mmap和munmap函数将文件的某些部分映射到内存中.有关将文件映射到内存的更多信息.
  • 避免无限制的问题集:无限制的问题集可能需要任意大量的数据来计算.如果该集需要的内存超过可用内存,则您的应用可能无法完成计算.您的应用应尽可能避免此类设置,并处理已知内存限制的问题.