2011-06-28 59 views
1

因此很明顯,在iPod第二代我的應用程序崩潰是由於內存不足的問題。我做的是在用戶滾動時在scrollView + pageControl內的每個視圖上調用圖像。在獲得記憶警告後,它在達到某個特定點時崩潰。當我收到警告時,我試圖釋放視圖,但仍然導致崩潰。iOS4調用ImageNamed:仍然泄漏或導致內存問題?

我GOOGLE了約ImageNamed:顯然有這個API調用中的問題,但大多數文章說,這是固定在最近的iOS版本。

我解決了這個問題,調用圖像imageWithContentOfFile代替imageNamed,但我想知道如果ImageNamed還是引起了內存泄漏,或者視圖被釋放時沒有釋放。

+0

什麼操作系統版本在你的iPod touch第二代運行? –

+0

我相信它的iOS 4.2.1 – REALFREE

+0

它沒有泄漏圖像,它緩存它(如RyanR下面解釋的),只使用'imageNamed:'爲小圖像,這將永遠由您的應用程序和多個位置使用 – bshirley

回答

7

imageNamed:不會導致泄漏,但它經常被誤解這是當它是用什麼導致內存問題。它會在加載後緩存未壓縮的圖像,這意味着該圖像在內存中立即有2個副本。如果您將它用於小的,經常使用的圖像(如圖標),這非常棒,因爲運行時無需從磁盤獲取文件 - 它已在緩存中提供。當用戶遇到麻煩的時候,他們使用imageNamed:加載大圖像,例如用相機拍攝的4MP圖像。該圖像takes up quite a bit of memory:400萬像素,類型4像素每像素= 16MB的內存,TWICE。如果您使用該方法爲幻燈片,照片共享,相機應用或其他任何應用程序加載圖像,則它會快速增加。

所以,如果這些功能不適合你所需要的,請使用其他UIImage的運輸方式之一。你的用戶會感謝你。

注意:這些信息來自提供UIKit渲染會話的Apple工程師(我認爲它是#121)。希望我的說明是正確的:)

+0

我明白imagenamed緩存圖像文件,但我的圖像是非常小的(40kb至500kb),仍然最終在iPod的第二代內存上遇到麻煩..大概第二代有相當少量的內存? (在iPhone4上正常工作) – REALFREE

+0

可能是這樣的。另外,500kb可能是圖像的_compressed_大小,但內存中的大小會更多:長度x寬度x每像素的位數。你是否試過在樂器中運行它? – RyanR

+0

是的,我檢查了儀器,我沒有看到那麼多的分配發生。這是大約1-2MB的分配總計 – REALFREE