1. 程式人生 > >ios 效能優化之ImageView的那些事

ios 效能優化之ImageView的那些事

最近在做一個ipad專案,專案裡有好多的大圖片。專案執行起來後,瀏覽一些圖片後,記憶體就開始暴漲。漲到500多兆,根本看不下去啊。為了解決這個問題,開始尋找各種解決方案。還好最終算是找到了。下面分享一下。

圖片過大,記憶體暴漲。我是從兩個方面著手解決的。

一 :從圖片入手
記憶體佔用大原因是圖片太大,所以想到對圖片進行壓縮。找了好多壓縮工具,最後發現一款比較好用的,名字是ppDuck(pp鴨),這裡是下載地址http://ppduck.com/,圖片壓縮後,記憶體確實是暫用較少了,但還沒有根本結局。

二:從載入圖片的方式考慮
正確選擇圖片載入方式能夠對記憶體優化起到很大的作用,常見的圖片載入方式有下面三種:

//方法1  
UIImage *imag1 = [UIImage imageNamed:@"image.png"];  
//方法2  
UIImage *image2 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"[email protected]" ofType:.png]];  
//方法3  
NSData *imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"[email protected]
" ofType:png]]
; UIImage *image3 = [UIImage imageWithData:imageData]

第一種方法
imageNamed:
imageNamed的優點在於可以快取已經載入的圖片。蘋果的文件中有如下說法:
This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.
這種方法會首先在系統快取中根據指定的名字尋找圖片,如果找到了就返回。如果沒有在快取中找到圖片,該方法會從指定的檔案中載入圖片資料,並將其快取起來,然後再把結果返回。對於同一個影象,系統只會把它Cache到記憶體一次,這對於影象的重複利用是非常有優勢的。例如:你需要在 一個TableView裡重複載入同樣一個圖示,那麼用imageNamed載入影象,系統會把那個圖示Cache到記憶體,在Table裡每次利用那個圖 像的時候,只會把圖片指標指向同一塊記憶體。這種情況使用imageNamed載入影象就會變得非常有效。

第二種方法和第三種方法
imageWithContentsOfFile:和imageWithData:這兩種方法的本質是一樣的。
這兩種方法只是簡單的載入圖片,並不會將圖片快取起來,影象會被系統以資料方式載入到程式。當你不需要重用該影象,或者你需要將影象以資料

總結:
所以,一些不常用到的大圖儘量使用方法2或方法3,這樣就不會快取這些圖片,從而達到解決記憶體的目的。對於常用到的小圖(如app裡的各種小圖示)使用方法1,可以節省出每次都從磁碟載入圖片的時間,這樣能更好的響應使用者的操作。

備註:
方法2和方法3,不能將用到的圖片放在“Assets.xcassets”管理,要放在目錄資料夾下,這樣才可以使用。

參考博文:http://blog.csdn.net/Apple_app/article/details/38846631
感謝博主分享