2010-08-05 47 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