天天看點

[IOS]來回加載大量圖檔記憶體溢出的問題

用xcode的instrument工具檢視記憶體使用情況時,發現程式使用記憶體情況很穩定維持在1.3M左右,也沒有記憶體洩漏。那麼問題來了,程式無故退出肯定是記憶體溢出了,而instrument并顯示沒有溢出(一般單個程式記憶體消耗唯20M左右會發警告,30M程式崩潰退出)。是以一直在想是不是哪個地方忘記釋放記憶體了,經過仔細檢查,并不存在沒有釋放的記憶體啊,糾結了一天。最後終于找到問題所在了,是[UIImage imageNamed@""]在搞鬼;

      翻看了一些網上資料http://www.cocoachina.com/bbs/simple/?t36896.html,總結一下UIImage的記憶體使用及管理

用UIImage加載圖像的方法很多,最常用的是下面兩種:

1.用imageNamed函數

2.用NSData的方式加載,例如:

由于第一種方式要寫的代碼比較少,可能比較多人利用imageNamed的方式加載圖像。其實這兩種加載方式都有各自的特點。

1)用imageNamed的方式加載時,系統會把圖像Cache到記憶體。如果圖像比較大,或者圖像比較多,用這種方式會消耗很大的記憶體,而且釋放圖像的記憶體是一件相對來說比較麻煩的事情。例如:如果利用imageNamed的方式加載圖像到一個動态數組NSMutableArray,然後将将數組賦予一個UIView的對象的animationImages進行逐幀動畫,那麼這将會很有可能造成記憶體洩露。并且釋放圖像所占據的記憶體也不會那麼簡單。但是利用imageNamed加載圖像也有自己的優勢。對于同一個圖像系統隻會把它Cache到記憶體一次,這對于圖像的重複利用是非常有優勢的。例如:你需要在一個TableView裡重複加載同樣一個圖示,那麼用imageNamed加載圖像,系統會把那個圖示Cache到記憶體,在Table裡每次利用那個圖像的時候,隻會把圖檔指針指向同一塊記憶體。這種情況使用imageNamed加載圖像就會變得非常有效。

2)利用NSData方式加載時,圖像會被系統以資料方式加載到程式。當你不需要重用該圖像,或者你需要将圖像以資料方式存儲到資料庫,又或者你要通過網絡下載下傳一個很大的圖像時,請盡量使用imageWithData的方式加載圖像。

無論用哪種方式加載圖像,圖像使用結束後,一定要記得顯示釋放記憶體。

是以當程式要加載大量圖檔時赢盡量使用第二種方法。