iPhone OS内存警告。不同级别是什么意思?


85

关于在iPhone OS设备上管理内存的妖术:不同级别的内存警告是什么意思。1级?2级?拨盘转到11吗?

上下文:经过长时间的内存压力测试-包括在播放iPod音乐播放器应用程序的同时运行我的iPad应用程序,我倾向于忽略收到的随机但很少出现的内存警告。我的应用程序永不崩溃。曾经 我的应用程序无泄漏。而且,内存警告似乎并不重要。

谢谢,
道格

Answers:


98

基本上,警告表示该设备的内存不足,并且,“如果您可以释放一些内存,则您没有在积极使用该内存 ”。如果您的内存管理很严格,并且您几乎没有可以丢弃的对象,则只需传递消息并忽略它即可。


25
大声笑“如果您可以释放一些内存,那么您不积极使用它将会膨胀!” 无价的;-)欢呼声
邓格拉

15
您听起来像是iPhone OS记忆力破烂的老手。
dugla 2010年

193

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


有4级警告(0到3)。这些是从内核内存监视程序设置的,可以通过不太公开的功能获得OSMemoryNotificationCurrentLevel()

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

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

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

终止活动的应用程序(jetsam)不是由SpringBoard处理,而是由处理launchd


谢谢你 在这个问题上,您和喜剧演员威利汉姆折腾了。幽默胜出。干杯。
dugla 2010年

嗨,我有同样的问题。在连续运行应用程序超过5次之后,我收到了“收到内存”警告。级别= 20,但应用程序没有崩溃。但是,当我收到此消息时,收到内存警告。等级= 2我的应用程序崩溃了。在Level1出现近20次之后,出现了Level2。如何使我的应用程序不崩溃。谢谢
srikanth rongali 2010年

1
@Kenny:更少的内存意味着,我们可以使用最大的内存。我们可以拥有多少字节。在崩溃日志中,我得到了这个。可用页面:371有线页面:12192可清除页面:0最大进程:DTMobileIS这是什么意思?我应该在哪里照顾?谢谢。
srikanth rongali

9
@srik:您最好问一个新问题
kennytm 2010年

@kennytm:使用ios8还是可以吗?我已经看到该函数在中定义libsystem_c.dylib。如果我可以继续使用它,那就太好了。谢谢
focs

12

OSMemoryNotification.h

/*
** Threshold values for notifications
*/

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

总共5个级别的内存警告(-1,3)。

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

我想添加一些相关的观点,可能对PM和其他方面有所帮助。


出现内存级别警告时该怎么办?

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


如何观察内存水平警告?

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

当系统向您的应用程序发出内存不足警告时,请立即响应。每当可用内存量降至安全阈值以下时,iOS就会通知所有正在运行的应用程序。(它不会通知已暂停的应用程序。)如果您的应用程序收到此警告,则必须释放尽可能多的内存。最好的方法是删除对缓存,图像对象和其他数据对象的强引用,这些引用可以在以后重新创建。

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

  • 实现您的应用程序委托的applicationDidReceiveMemoryWarning:方法。
  • 重写自定义UIViewController子类中的didReceiveMemoryWarning方法。
  • 注册以接收UIApplicationDidReceiveMemoryWarningNotificationnotification。

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

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

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


如何明智地分配内存?

  • 减少对自动释放对象的使用:使用自动引用计数(ARC),最好分配/初始化对象,并让编译器在适当的时候为您释放它们。即使对于过去可能会自动释放以防止它们超出当前方法范围的临时对象,也是如此。
  • 对资源施加大小限制:避免在较小的文件加载时加载较大的资源文件。与其使用高分辨率图像,不如使用适合基于iOS的设备的尺寸的图像。如果必须使用大型资源文件,请找到在任何给定时间仅加载文件所需部分的方法。例如,不是将整个文件加载到内存中,而是使用mmap和munmap函数将文件的某些部分映射到内存中或从内存中映射出来。有关将文件映射到内存的更多信息。
  • 避免无限制的问题集无限制的问题集可能需要任意大量的数据来进行计算。如果该集合需要的内存超过可用内存,则您的应用程序可能无法完成计算。您的应用应尽可能避免此类设置,并处理已知内存限制的问题。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.