2010-05-09 103 views
0

好的,這是我的問題。我的iPhone應用程序在磁盤上爲1.2MB。當然,我有一堆用於GUI按鈕和背景的圖像等。在內存中,我的應用佔用了高達15MB!iPhone應用程序佔用太多內存

這意味着如果我使用相機拍攝一張8MB的默認照片,即使在選取器調用它的代表之前,它也會給出一個內存警告(幾個)!

我該如何判斷抓住這麼多內存以及如何去除它?我已經刪除了所有調試符號並添加了[-Os],但它仍佔用大量內存!

---編輯---

我的應用程式是否在strongfortressgames.weebly.com - 應用程序 「Thunderclash」 佔用了15 MB!這是一個愚蠢的小應用程序!我怎樣才能讓這些更小?

+0

將解決問題分解爲單獨的問題。 – 2010-05-09 21:50:13

+0

我的測試儀的越獄手機似乎加重了這個問題。它將圖像保存到磁盤上 - 但不會將其加載到內存中。 – 2010-05-14 14:15:14

回答

2

唯一的時間內存警告是壞的,如果沒有內存釋放。然後他們成爲內存失敗,應用程序終止。

一旦你加載像png和jpg這樣的壓縮圖像到內存中,它們就會被解壓縮,並且通常佔用10倍的大小。當您使用[UIImage imageNamed:]時,它將圖像緩存在內存中。這是由xib加載的任何圖像隱含的。當它收到內存警告時,它會釋放緩存中的圖像。

您擁有的不是圖像的任何視圖都可能將渲染內容緩存在內存中。當收到內存警告時,緩存將被清除,除非當前顯示。整個視圖層次結構也可能由當前未顯示的視圖控制器釋放。

內存警告是應用程序運行時的正常部分。它們不表示內存泄漏。他們只是告訴你和系統應該釋放空閒內存。

儘管在沒有內存警告的情況下運行它可能是一個令人欽佩的目標,但通常需要分配內存,除非其他內容需要,否則保留內存效率更高。從內存緩存清除映像時,下次必須從磁盤讀取映像。

如果您知道的圖片只會一次或很少需要,您可以通過除[UIImage imageNamed:]之外的呼叫加載它以避免高速緩存。例如,僅在應用程序啓動時加載的輔助啓動畫面。

+0

我要加載的大多數圖像來自Bundle,或者來自用戶從圖庫中加載圖片或加載的圖片。 我認爲我遇到的問題是用相機拍照 - 在委託人保存之前我失去了照片。在我可以寫入磁盤之前,它似乎要清理房屋。 – 2010-05-10 12:00:26

+0

啊,我錯過了這個問題。我一次打開足夠的圖像超過24MB左右,你有麻煩。我沒有更多的東西可以提供,但是可能在'[UIImage dealloc]中設置一個斷點將有助於它不是自動發佈。我的直覺是,它只是部分與記憶警告有關,而其他的則是錯誤的。祝你好運。 – drawnonward 2010-05-10 16:38:32

0

好的,如果你的應用程序在磁盤上/購物車上的容量不是很大,這意味着你的應用程序內部會有一些非常大的內存分配。在你的memAlloc/new()函數中放置一箇中斷或日誌跟蹤器,看看你的空間在吃什麼。解壓縮的大型GUI組件可能是非常大的緩衝聲音文件的罪魁禍首。但是,沒有那個日誌追蹤,我們只能猜測。請轉到源代碼。