IOS如何選擇圖片加載方式:imageNamed和imageWithContentsOfFile的區別

IOS如何選擇圖片加載方式:imageNamed和imageWithContentsOfFile的區別

作者:wangzz
轉載請註明出處
如果覺得文章對你有所幫助,請通過留言或關注微信公衆帳號wangzzstrive來支持我,謝謝!
 
IOS內存稀缺,而圖片資源通常又是最佔內存的部分之一,因此,選擇如何加載圖片,對於優化應用內存佔用量,能起到立竿見影的效果。通常加載圖片的方式有兩種:

一、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 locates and loads the image data from disk or asset catelog, and then returns the resulting object. You can not assume that this method is thread safe.

這種方法會首先在系統緩存中根據指定的名字尋找圖片,如果找到了就返回。如果沒有在緩存中找到圖片,該方法會從指定的文件中加載圖片數據,並將其緩存起來,然後再把結果返回,下次再使用該名稱圖片的時候就省去了從硬盤中加載圖片的過程。對於相同名稱的圖片,系統只會把它Cache到內存一次。

另外,在iOS4及以上系統中,如果是PNG格式的圖片,使用該方法加載時不用再指定文件的.png後綴,即只寫文件名稱即可。

最後,在iOS4及以上系統中,如果屏幕的scale是2(即高分辨率屏幕),該方法會自動使用加上@2x後綴的圖片。比如在高分辨率屏幕設備上要加載名稱爲button的圖片,該方法會自動使用名稱爲button@2x的圖片;如果找不到該名稱圖片再去加載名稱爲button的圖片。這就爲開發者省去了適配高、低分辨率屏幕的時間。

二、imageWithContentsOfFile或者imageWithData

而imageWithContentsOfFile方法只是簡單的加載圖片,並不會將圖片緩存起來,圖像會被系統以數據方式加載到程序。當你不需要重用該圖像,或者你需要將圖像以數據方式存儲到數據庫,又或者你要通過網絡下載一個很大的圖像時,可以使用這種方式。

三、如何選擇

兩種加載圖片方法的使用方式:

UIImage *img = [UIImage imageNamed:@"myImage"]; // caching  
// or  
UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching
那麼該如何選擇呢?

如果加載一張很大的圖片,並且只使用一次,那麼就不需要緩存這個圖片。這種情況imageWithContentsOfFile比較合適——系統不會浪費內存來緩存圖片。

然而,如果在程序中經常需要重用的圖片,比如用於UITableView的圖片,那麼最好是選擇imageNamed方法。這種方法可以節省出每次都從磁盤加載圖片的時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章