iOS 開發----imageNamed和imageWithContentsOfFile區別

在 Apple 官方幫助文檔提供了兩個加載圖片的方法數據庫

  1. imageNamed , 其參數爲圖片的名字緩存

  2. imageWithContentsOfFile , 其參數是圖片文件的路徑網絡


下面主要是說一下他們的區別:spa

imageNamed:
指針

用這個方法加載圖片分爲兩種狀況:code

  1. 系統緩存有這個圖片orm

            直接從緩存中取得對象

  2. 系統緩存沒有這個圖片圖片

            經過傳入的文件名對整個工程進行遍歷 , 若是若是找到對應的圖片 , iOS 系統首先要作的是將這個圖片放到系統緩存中去,以備下次使用的時候直接從系統緩存中取 , 接下來重複第一步.內存

那麼試想一下 , 若是要加載的這個圖片的文件量不少,文件大小很大,內存不足,內存泄露,甚至是程序的崩潰都是很容易發生的事.

[UIImage imageNamed:ImageName];

imageWithContentsOfFile 和 initWithContentsOfFile

用這個方法只有一種狀況,那就是僅僅加載圖片 , 圖像數據不會被緩存 . 所以在加載較大圖片的時候 , 以及圖片使用狀況不多的時候能夠使用這兩個方法 , 下降內存消耗.

NSString *imageFile = [NSString stringWithFormat:@"%@/%@.jpg", [[NSBundle mainBundle] resourcePath], fileName];
UIImage* image = [UIImage imageWithContentsOfFile:imageFile];

若是想把上述代碼簡寫爲一行能夠在 pch 文件中定義一個宏,在整個項目中使用

#define ResourcePath(path)  [[NSBundle mainBundle] pathForResource:path ofType:nil]
#define ImageWithPath(path) [UIImage imageWithContentsOfFile:path]

這樣就能夠一行代碼搞定

UIImage* image = ImageWithPath(ResourcePath(@"img.jpg"));

總結:

根據各自的優缺點來選擇性的使用相應的方法.

  1. 當圖片文件較小 , 使用比較頻繁的時候那麼使用 imageNamed 比較好.例如:UITableViewCell , UICollectionCell 等加載同一個圖標的時候 , 在Table裏每次利用那個圖像的時候,只會把圖片指針指向同一塊內存。能夠直接從緩存中取的數據而不用遍歷整個工程.在這種狀況下 imageNamed 的效率仍是很是高的.同一個圖片對象系統只會把它 Cache 到內存一次 ,  這對圖像的重複利用是很是有優點的.

  2. 你用第二種方式加載的時候 , 圖像會被系統以數據的形式加載到程序 . 當你不須要重用該圖像,或者你須要將圖像以數據方式存儲到數據庫,又或者你要經過網絡下載一個很大的圖像時,請儘可能使用imageWithData的方式加載圖像。


著做權聲明:本文爲做者原創,歡迎轉載分享。請尊重做者勞動,轉載時保留該聲明和做者博客連接,謝謝!

相關文章
相關標籤/搜索