2010-07-29 109 views
1

所以我安裝了我的應用程序在我的iPad上,它由於內存問題崩潰。我想這是因爲我使用的是非常大的圖像文件,所以我回過頭來減少它們,通過調整它們大小然後使用PNGCrush來減少大約75%的尺寸。圖片問題的iPad - 內存問題

現在,至於運行程序,如果我有我的4個單獨的選項卡中的每一個的背景圖像,如果我每次切換標籤時將圖像設置爲Null,還是應該讓它們保持設置, ?我有一個頁面上有幾十個圖像,因爲它們起到按鈕的作用,從我聽到的聲音來看,這聽起來像是我應該在看不到該頁面時清除它們。那是對的嗎?

現在,當我啓動時,我加載了應用程序中所有內容的所有圖像:「現在加載並完成它」的心態,但從我一直在閱讀的內容中導致內存因爲沒有太多的內存可供使用。這是否意味着每當我切換標籤或視圖時,我想清除那些不可見圖像中的所有圖像,然後在我們回到它們時重新加載它們?這會導致性能的提高嗎?或者至少可以防止崩潰?我的程序在模擬器中工作,但是當我在ipad上運行它時,它只是爆炸=/

謝謝!

編輯:我使用MonoTouch的BTW,因此一切都在C#

UIImage BG = UIImage.FromFile("Images/Makes/explosion.png"); 
UIImage basic = UIImage.FromFile("Images/Models/camaro.png"); 
UIImage advance = UIImage.FromFile("Images/search.png"); 

AdvancedSearchButton.SetBackgroundImage(advance, UIControlState.Normal); 
ImageSearchButton.SetBackgroundImage(basic, UIControlState.Normal); 
MainBG.Image = BG; 

BG.Dispose(); 
basic.Dispose(); 
advance.Dispose(); 

現在我知道在普通的C#dispose()實際上並不「免費」的記憶,但我讀的東西,指出它被轉換到"release",當它編譯到obj-c時,基本上可以釋放這些對象。

此外,我想知道是否需要dispose()個別按鈕和圖像後,我不再查看它們。我只是將圖像設置爲NULL,但這給了我錯誤。

MainBG.Dispose(); 
AdvancedSearchButton.Dispose(); 
ImageSearchButton.Dispose(); 

非常感謝您的幫助!

EDIT2:

所以我只是想上面的代碼和背景圖像和其他一切都還在那裏好像沒有什麼實際得到清除出現。建議?

回答

2

iPhone沒有虛擬內存,並且沒有垃圾回收。所以一旦內存中加載了內容,它會一直保留在內存中,直到代碼明確釋放它爲止。如果你不使用一些資源,你應該儘快清理它們。

此外,你應該聽取來自iOS的低內存警告,這是你的代碼做一些內部清理的另一個機會。

+0

「因此,一旦某物被加載到內存中,它會一直保留在內存中,直到您的代碼明確釋放它」 這是否意味着如果我在選項卡1中設置背景,我會希望「釋放它」通過設置爲空?這項工作是否還有其他我需要做的事情? 我理解釋放/釋放記憶的概念,我只是不知道如何在這種情況下做到這一點。 我的應用程序的大部分只是帶有圖像的按鈕。 – Adam 2010-07-30 14:45:31

+0

在將指針設置爲NULL之前,您需要發送'release'消息到後備'NSImage'對象。 – 2010-07-30 14:48:54

+0

所以基本上我會加載我的NSImage從我的文件,設置我的圖像,然後釋放NS圖像?當我切換到另一個標籤時,我會將該圖像設置爲空。 如果我回到那個標籤,我會再衝洗並重復。正確? – Adam 2010-07-30 15:17:19

0

首先,懶惰加載您的資源,除非您有合理的理由不要。其次,我不確定你的圖像有多大,但是對於大圖像(本質上是用於背景或其他方面的圖像),一般來說,我會把它們分成大塊,然後加載它們懶惰地猜測它,因爲它們是需要的。

你應該做的是正確處理你的記憶警告。取消分配並非絕對關鍵的任何資源 - 即其他標籤中其他視圖上的項目或隱藏內容。您必須重新加載它們。

你還應該看看使用儀器來確定你是否泄漏(我希望你已經這樣做了),檢查你的程序,看看你能否在低內存情況下將一些緩存資源保存到磁盤等