2010-08-05 49 views

回答

6

我把这个作为一个单独的答案比我的另一个添加,因为它是一个单独的答案。我之前给出的答案是实际的,你应该使用的。它归结为“处理你通知的一个级别的记忆警告,不关心细节”。

但是,如果你真的想知道更多一点,看看这个未公开的API:http://www.opensource.apple.com/source/Libc/Libc-594.1.4/include/libkern/OSMemoryNotification.h

这是产生记忆警告,内核代码的头,而且它声明了以下的typedef:

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

我们显然没有执行数学运算来说明要返回哪个警告的关键方法(OSMemoryNotificationCurrentLevel()),但这是可能返回值的列表。

您可以使用Mach.h库来测试设备上的实际内存级别(如果您想要某些代码,请告诉我),然后使用OSMemoryNotificationCurrentLevel()获取当前级别的内存警告,并确实将通知级别映射到机器的物理状态。这样的应用程序在应用程序商店中完全不受欢迎,并且它不会真正帮助您实际的生活发展,您的工作是响应您收到的单一级别的低内存警告。

+0

我明白了。并且非常感谢这些信息,这非常有用。我的想法是,如果我在警告2级后才被踢掉,也许我可以利用这一点,并且只在警告级别2时才会真正做出令人痛苦的阻碍。 – user309305 2010-08-06 13:23:35

+0

我认为警告级别二意味着“你现在要离开了”。在实践中,你会得到一杆。您可能会在应用程序的整个生命周期中多次获得一次,但没有“建议”级别的内存警告。你应该认真对待你的第一个警告。 – 2010-08-06 14:08:24

+0

确实有人使用这个存储目标应用程序?我的意思是,我不想让应用程序被拒绝= D – Omer 2011-05-09 18:29:04

4

这并不是说有两个级别的警告 - 不是像“你有一点点内存剩余”,然后“你剩下的内存少”。这是相同的“低内存”警告被解雇了两个地方。一旦在当前视图中的UIViewController子类上(并且,如果该UIVC没有实现didReceiveMemoryWarning,那么它将冒泡到视图控制器堆栈的顶部)并且再次在applicationDidReceiveMemoryWarning中的应用代理上。一个人不是比另一个更糟糕的警告,他们只是两个不同的钩子来执行对来自操作系统的相同警告的响应。

这是平台的怪癖之一,你不能真正知道你有多少内存可用在任何时间。后台应用程序(邮件,电话等)吸收尽可能多的RAM,剩下的就剩下剩下的事情了,而且只有这样才能知道自己变得太大了。

通过抛弃现在不需要的资源,恰当地做出反应非常重要。从低垂的果实开始 - 任何你以后需要保留的东西。举例来说,您可以随意拖放图像,然后在需要时从服务器或磁盘中取出图像。

+0

我完全同意,但我不确定我们在谈论同样的事情。起初我没有实现任何提到的内存警告方法。结果发生的是以下几点。在应用程序中瞎弄后,我在调试控制台中收到以下消息: “2010-08-06 11:12:42.880 blaApp [9591:207] Received memory warning。Level = 1” 我一直在做什么我做了,几秒钟后,我得到了 “2010-08-06 11:12:55.171 blaApp [9591:207]收到内存警告。我想知道的是这个级别的属性。 – user309305 2010-08-06 09:20:36