Apple将lev = 1和lev = 2的内存警告定义为非常不同(一个是“嗯。内存不多。小心”,另一个是“我即将杀死一个进程,你有5 ... 4 ... 3 ......“)
...但是你如何找到以编程方式你收到了哪一个?
我有一个使用专业工具处理图像的iPad应用程序,并且lev = 1内存警告是不可避免的 - 即使处理小块图像,它仍然会耗费大量内存来显示所有GUI等。
我得到lev = 1所有时间,我几乎无能为力。
lev = 2个内存警告是一个非常不同的问题。如果我得到一个lev = 2通常意味着有一些后台应用程序会占用大量内存,或者用户所做的事情会使内存膨胀 - 我需要采取紧急措施来防止我被杀。有些事情我可以做 - 但所有这些都对用户不利(例如删除所有GUI,等待几秒钟,然后重新加载)。
所以......我在“didRecieveMemoryWarning”中需要两个不同的代码路径:一个用于lev = 1个警告,一个用于lev = 2个警告。
编辑:有关警告级别的一些信息:iPhone OS Memory Warnings. What Do The Different Levels Mean?
注意:Apple经常“不记录”事情。如果我们作为开发人员只坚持记录的信息,以及API的无错误部分,那么许多(大多数?)边界推送应用程序将在以后的几个iOS版本中不存在。相反,我们解决这些错误,并且我们会弄清楚苹果公司未能记录它的实际情况。
EDIT2:...查看链接的头文件,看起来像是苹果用来找出当前哪个级别的底层私有函数:“OSMemoryNotificationLevel OSMemoryNotificationCurrentLevel(void)” - 但我想我们无法获得过去的Apple提交:(?
答案 0 :(得分:6)
我认为警告级别不适用于应用程序,但我知道这不是您想要听到的 - 这并不重要。仅仅因为操作系统有两个不同级别的内存警告并不意味着你应该在每个级别做不同的事情,并希望其他应用程序做正确的事情。
强烈建议您实施此方法。如果你的 应用程序在低内存期间不会释放足够的内存 条件,系统可以直接终止。
没有“小心”或“即将杀人”的说法。 可能是当前发生的事情,但在iOS5中是否相同?还是在以后的版本?做出那些假设是非常危险的。
我认为您需要考虑优化内存使用情况。几乎总有一种方法可以优化图像,释放缓存/中间数据,更有效地使用自动释放池,更小/更有效的数据结构。您没有说明您目前使用的技术,因此很难具体说明。
答案 1 :(得分:0)
我没有尝试但可能有效的替代方法:捕获Apple系统记录器(ASL)的输出,查找lev2警告字符串。
假设Apple实际上正在使用ASL(它们可能不是!),您可以尝试按照此处的说明进行操作:http://www.cocoanetics.com/2011/03/accessing-the-ios-system-log/ - 显示如何使用Apple公共API访问ASL。