Memory management iPhone操作系统内存警告。不同的等级意味着什么?

Memory management iPhone操作系统内存警告。不同的等级意味着什么?,memory-management,ipad,warnings,Memory Management,Ipad,Warnings,关于iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么。一级?二级?拨到11了吗 背景:经过一段时间的内存压力测试——包括在iPod音乐播放器应用程序播放的情况下运行iPad应用程序,我倾向于忽略我收到的随机但不频繁的内存警告。我的应用程序从不崩溃。曾经我的应用程序是无泄漏的。而且,mems警告似乎并不重要 谢谢, Doug基本上,这些警告意味着设备内存不足,“如果您可以释放一些内存,您没有积极使用这些内存,那将膨胀!”。如果您的内存管理很严格,并且没有实际上可以丢弃的对象

关于iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么。一级?二级?拨到11了吗

背景:经过一段时间的内存压力测试——包括在iPod音乐播放器应用程序播放的情况下运行iPad应用程序,我倾向于忽略我收到的随机但不频繁的内存警告。我的应用程序从不崩溃。曾经我的应用程序是无泄漏的。而且,mems警告似乎并不重要

谢谢,

Doug

基本上,这些警告意味着设备内存不足,“如果您可以释放一些内存,您没有积极使用这些内存,那将膨胀!”。如果您的内存管理很严格,并且没有实际上可以丢弃的对象,只需传递消息并忽略它。

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


有4个级别的警告(0到3)。这些是从内核内存观察程序设置的,可以通过

未记录如何触发液位。SpringBoard配置为在每个内存级别执行以下操作:

  • 警告(非正常)-重新启动或延迟自动重新启动非必要的后台应用程序,如邮件
  • 紧急-退出所有后台应用程序,例如Safari和iPod
  • 关键和超越-内核将接管,可能会扼杀SpringBoard甚至重新启动
  • SpringBoard不处理删除活动应用程序(jetsam),而是从

    总共5级内存警告(-1,3)

    关于内存级别警告描述,@KennyTM的回答非常好

    我想补充几个相关的点,这可能有助于下午和其他人


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

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


    如何观察内存级别警告?

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

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

    • 实现应用程序的ApplicationIDReceiveMemoryWarning:方法 代表
    • 在自定义设置中重写didReceiveMemoryWarning方法 UIViewController子类
    • 注册以接收 UIApplicationIDReceiveMemoryWarning通知

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

    • 消除内存泄漏
    • 使资源文件尽可能小
    • 对大型数据集使用核心数据或SQLite
    • 惰性地加载资源
    • 使用Thumb选项构建程序
    详情见


    如何明智地分配内存?

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

    LOL“如果你能释放一些你没有积极使用的内存,那就太棒了!”无价;-)干杯你听起来像是iPhone操作系统怪鼹鼠记忆舞蹈的老手。谢谢你。在这个问题上,你和喜剧演员威利厄姆有点犹豫。幽默获胜。干杯。嗨,我也有同样的问题。在应用程序连续运行5次以上后,我收到内存警告。级别=1达20次,但应用程序未崩溃。但当我收到这条信息时,收到了内存警告。级别=2我的应用程序正在崩溃。级别2出现在级别1出现近20次之后。如何使我的应用程序不崩溃。感谢you@Kenny:更少的内存意味着我们最多可以使用多少。我们可以有多少活动字节。在我的事故记录中我得到了这个。免费页面:371个有线页面:12192个可购买页面:0个最大流程:DTMobileIS这是什么意思?我应该在哪里照顾?谢谢。@srik:你最好。@kennytm:这对io来说还可能吗
    typedef enum {
        OSMemoryNotificationLevelAny      = -1,
        OSMemoryNotificationLevelNormal   =  0,
        OSMemoryNotificationLevelWarning  =  1,
        OSMemoryNotificationLevelUrgent   =  2,
        OSMemoryNotificationLevelCritical =  3
    } OSMemoryNotificationLevel;
    
    /*
    ** Threshold values for notifications
    */
    
    typedef enum {
        OSMemoryNotificationLevelAny      = -1,
        OSMemoryNotificationLevelNormal   =  0,
        OSMemoryNotificationLevelWarning  =  1,
        OSMemoryNotificationLevelUrgent   =  2,
        OSMemoryNotificationLevelCritical =  3
    } OSMemoryNotificationLevel;