Memory management iPhone操作系统内存警告。不同的等级意味着什么?
关于iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么。一级?二级?拨到11了吗 背景:经过一段时间的内存压力测试——包括在iPod音乐播放器应用程序播放的情况下运行iPad应用程序,我倾向于忽略我收到的随机但不频繁的内存警告。我的应用程序从不崩溃。曾经我的应用程序是无泄漏的。而且,mems警告似乎并不重要 谢谢,Memory management iPhone操作系统内存警告。不同的等级意味着什么?,memory-management,ipad,warnings,Memory Management,Ipad,Warnings,关于iPhone OS设备上管理内存的黑色艺术:不同级别的内存警告意味着什么。一级?二级?拨到11了吗 背景:经过一段时间的内存压力测试——包括在iPod音乐播放器应用程序播放的情况下运行iPad应用程序,我倾向于忽略我收到的随机但不频繁的内存警告。我的应用程序从不崩溃。曾经我的应用程序是无泄漏的。而且,mems警告似乎并不重要 谢谢, Doug基本上,这些警告意味着设备内存不足,“如果您可以释放一些内存,您没有积极使用这些内存,那将膨胀!”。如果您的内存管理很严格,并且没有实际上可以丢弃的对象
Doug基本上,这些警告意味着设备内存不足,“如果您可以释放一些内存,您没有积极使用这些内存,那将膨胀!”。如果您的内存管理很严格,并且没有实际上可以丢弃的对象,只需传递消息并忽略它。SpringBoard会记录内存级别警告。作为一名应用程序开发人员,你不需要关心它。仅响应
-{application}didReceiveMemoryWarning
就足够了
有4个级别的警告(0到3)。这些是从内核内存观察程序设置的,可以通过 未记录如何触发液位。SpringBoard配置为在每个内存级别执行以下操作:
出现内存级别警告时应该怎么做? 在收到这些警告后,处理程序方法应该立即释放所有不需要的内存。例如,UIViewController类的默认行为是清除当前不可见的视图;子类可以通过清除其他数据结构来补充默认行为。维护图像缓存的应用程序可能会释放屏幕上当前未显示的任何图像
如何观察内存级别警告? 从 当系统向应用程序发送内存不足警告时,请立即响应。当可用内存量降至安全阈值以下时,iOS会通知所有正在运行的应用程序。(它不会通知挂起的应用。)如果你的应用收到此警告,它必须释放尽可能多的内存。最好的方法是删除对缓存、图像对象和其他可以稍后重新创建的数据对象的强引用 UIKit提供了几种接收内存不足警告的方法,包括以下几种:
- 实现应用程序的ApplicationIDReceiveMemoryWarning:方法 代表
- 在自定义设置中重写didReceiveMemoryWarning方法 UIViewController子类
- 注册以接收 UIApplicationIDReceiveMemoryWarning通知
如何减少应用程序的内存占用?
- 消除内存泄漏
- 使资源文件尽可能小
- 对大型数据集使用核心数据或SQLite
- 惰性地加载资源
- 使用Thumb选项构建程序
如何明智地分配内存?
- 减少自动释放对象的使用:使用自动引用 计数(ARC),最好是alloc/init对象并让 编译器在适当的时候为您发布它们。这是真的 即使是过去可能有的临时对象 自动释放,以防止他们超出 当前方法
- 对资源施加大小限制:避免加载大型资源文件 小一点的就行了。而不是使用高分辨率图像, 使用适合基于iOS的设备的尺寸。如果你 必须使用大型资源文件,找到只加载 您在任何给定时间所需的文件。例如,而不是 使用mmap和munmap函数将整个文件加载到内存中 将文件的部分映射到内存中或从内存中映射出来。更多 有关将文件映射到内存的信息
- 避免无界问题集:无界问题集可能需要 需要计算的任意大量数据。如果集合需要 内存不足,您的应用程序可能无法完成此操作 计算。您的应用程序应尽可能避免此类设置,并且 处理已知内存限制的问题
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;