簡體   English   中英

iOS應用程序內存不足而沒有收到內存不足警告

[英]iOS app runs out of memory without receiving a low memory warning

我有一個現有的應用程序,我做了一些最近的更改,我一直在測試這些更改。 該應用程序在我測試的每個iPad上運行得非常好(iOS 4和iOS 5)。 在我的應用程序中加載了幾個(50+)圖像密集的視圖后,我得到一個低內存警告,我的viewDidUnload方法被調用,他們正確地將所有控件都清零,我的內存中圖像緩存清除了自己,應用程序繼續精細。

但是,在iPhone 4和iPhone4s(iOS 5.0.1和iOS 5.1)上,我遇到了一個問題,即我的應用程序內存不足而沒有收到低內存警告。 在加載了幾個不同的視圖后,最終會出現一個新的視圖並且大部分是空白的,並且在控制台上我看到內存分配消息,整個手機變得沒有響應,有時會殺死我的應用程序。

發生這種情況的特定視圖每次都是不同的,因此它與任何一個視圖無關,只是隨着時間的推移而積累的內存。 我也確認我也沒有任何內存泄漏。

這個現有問題是類似的:

IOS應用程序因低內存而被殺死,但未收到內存警告

並且這個答案表明,如果我陷入循環,這可能會發生,但我很確定我的代碼不會卡在任何循環中。 我只是在UINavigationController中從一個視圖點擊到另一個視圖,並在每個視圖中加載了幾個圖像。 另外,另一個問題是專門在iPad上發生的,我沒有在iPad上看到這個問題,只有iPhone。

順便說一句,我已經嘗試通過NotificationCenter注冊低內存通知,並在我的app委托中有一個applicationDidReceiveMemoryWarning方法,並且兩者都有斷點,並且都沒有被調用。 此外,調試器控制台中也沒有顯示低內存消息。

關於可能發生的事情的任何想法?


在2012年3月26日添加:

有趣的是,當我在新iPad上測試我的應用程序時,它有同樣的問題,我在iPhone 4和4s上看到沒有收到低內存通知。 所以我想知道我是否看到了與其他線程相同的問題:

新iPad:低內存警告沒有出現?

但該線程上的開發人員正在測試僅限iPad的應用程序,因此不會在任何iPhone上測試和發現同樣的問題。

我做了一些廣泛的測試,並有一個設備列表,我正確地收到了低內存警告和我從未收到它的設備。 到目前為止,我只看到iOS5或更高版本的問題,但是在iOS1和iOS5的iPad1上我沒有看到問題,因此它不僅僅是iOS 5上所有設備上的問題。

這是那個清單:

適當的低內存警告

iPad1 4.2.1
iPad1 5.0
iPad1 5.1
iPad2 4.3.3
iPhone3G 4.2.1
iPod 3G 4.3.3
iPhone4 4.3.3

沒有低內存警告

iPhone4 5.1
iPhone4s 5.0.1
iPad3 5.1

過去一周,我一直在抨擊類似的問題。 我正在做一些不同的事情,但圖像有些相關。

您沒有說明所有這些圖像的位置 - 希望您將它們寫入文件系統,然后使用[UIImage imageWithContentsOfFile]將它們加載到視圖中(或者如果使用CGImageRefs,則使用CGImageSourceCreateWithURL)。 你想要避免的是將圖像存儲在內存中(在iOS中沒有交換!)。

在我的情況下,我有一些mmap內存來保存圖像,我甚至沒有映射內存(它將它同步到文件系統),但由於同步需要這么長時間,我被“收費”的那個未同步的內存。 我所做的實際上是在每個文件上調用fcntl(fd,F_FULLSYNC)來強制系統在我繼續之前刷新每個塊。

我正在iPad 3上開發一款帶有大量大圖像的應用程序。

如果我將iOS 5.0設置為部署目標,那么如果應用程序消耗太多內存並且應用程序崩潰,則不會調用applicationDidReceiveMemoryWarning

但是, 如果我將iOS 5.1設置為部署目標,則會調用applicationDidReceiveMemoryWarning 因此,操作系統刷新包含先前加載的圖像的緩存,並且應用程序不會崩潰。

主要的問題是我使用UIImage imageNamed:加載我的圖像,如果你的圖像很大,請使用UIImage imageWithContentsOfFile這樣它們就不會被緩存(如果@ 2x的大小非常大,這就是一個問題)。

請注意,如果我非常快速地顯示許多圖像,則在iOS 5.1中不會及時調用applicationDidReceiveMemoryWarning ,而且我崩潰了!

我已經在運行iOS 5.1的iPad 3上找到了確切的行為。 不會調用applicationDidReceiveMemoryWarning,也不會調用UIApplicationDidReceiveMemoryWarningNotification的NSNotifications。 我還在其他一些設備上測試了完全相同的代碼,因此您可以將這些代碼添加到您的列表中:

適當的低內存警告

iPad 2 5.0.1
iPad 2 4.3.5
iPhone 3GS 5.0.1

沒有低內存警告

iPad 3 5.1

模式可以是:具有512 MB的iOS設備或運行5.0.1 - 5.1的1 GB內存。

我沒有在這個應用程序中進行任何繁重的UIImage處理。 似乎操作系統的行為已經發生了變化 - 要么是故意殺死應用程序更積極(例如,試圖更聰明地殺死看起來好像他們的內存使用過於繁重的應用程序),要么只是打破了低內存通知。

您可以嘗試使用儀器運行“Time Profiler”工具嗎? 它會告訴你你是否在一個不同的線程中綁定CPU(雖然除非你自己創建它們,但如果是這樣的話,我會感到驚訝)。 如果不顯示吸煙槍,也可以運行“Allocations”儀器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM