2013-02-05 127 views
3
下的iOS

應用程序通過這些機制收到低內存警告:的iOS低內存警告和模擬器的 「模擬內存警告」

  • [AppDelegate applicationDidReceiveMemoryWarning:]

  • UIApplicationDidReceiveMemoryWarningNotification

  • [UIViewController didReceiveMemoryWarning]

Wha t是這些項目之間的關係嗎?當收到低內存條件或它們有細微差別時,它們全部發生嗎?他們按什麼順序執行?

在模擬器中有一個選項來「模擬內存警告」。除了在所有UIViewControllers上調用didReceiveMemoryWarning:以外,這是否會執行任何操作?

我想使用Xcode分析器工具來查看這些日子圍繞由緩存[UIImage imageNamed:]方法加載的圖像發生的事情 - 它們是否未緩存? - 但我需要知道如何「正確地」觸發低內存條件 - 即使它只是通過分配大量內存。

回答

3

在回答關於imageNamedUIImage緩存的問題時,是的,它似乎確實清除了緩存。在這裏,我通過imageNamed裝225倍的圖像,然後20秒到執行,我模擬內存警告:

allocations for imageNamed

說了這麼多,我覺得imageNamed緩存是一把鈍刀,我喜歡做我通過NSCache自己的緩存,所以我可以通過設置countLimit來約束它應該保留在緩存中的圖片數量,目標是防止出現內存警告。順便說一下,雖然NSCache不響應UIApplicationDidReceiveMemoryWarningNotification,但它會在真正的低內存情況下自動清除自身。但它不會響應模擬器中手動模擬內存警告。

不管怎麼說,這是一個NSCache日誌加載圖像的,先不countLimit並其次50的countLimit,在每年年底清除緩存:

NSCache without and with countLimit

+0

感謝羅布。有趣的是,看到'模擬記憶警告'會做它應該做的事情 - 我擔心這是一個簡單的叫做didReceiveMemoryWarning的美容蓬鬆選項,而沒有其他任何東西。 – occulus

+0

@occulus我不怪你。當我第一次嘗試「模擬記憶警告」時,我也有同樣的擔憂。 – Rob

0

部分答案:

我已經證實,在模擬器(iOS6.1上的iOS模擬器6.0),「模擬內存警告」導致所有三種機制被觸發,順序如下:

  1. [AppDelegate applicationDidReceiveMemoryWarning:
  2. [UIViewController didReceiveMemoryWarning]
  3. UIApplicationDidReceiveMemoryWarningNotification
+0

好像UIApplicationDidReceiveMemoryWarningNotification是並不總是在較老的模擬器(我的情況下爲iOS 5模擬器)上觸發。 – Rivera