在 Apple 官方幫助文檔提供了兩個加載圖片的方法數據庫
imageNamed , 其參數爲圖片的名字緩存
imageWithContentsOfFile , 其參數是圖片文件的路徑網絡
下面主要是說一下他們的區別:spa
imageNamed:
指針
用這個方法加載圖片分爲兩種狀況:code
系統緩存有這個圖片orm
直接從緩存中取得對象
系統緩存沒有這個圖片圖片
經過傳入的文件名對整個工程進行遍歷 , 若是若是找到對應的圖片 , 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"));
總結:
根據各自的優缺點來選擇性的使用相應的方法.
當圖片文件較小 , 使用比較頻繁的時候那麼使用 imageNamed 比較好.例如:UITableViewCell , UICollectionCell 等加載同一個圖標的時候 , 在Table裏每次利用那個圖像的時候,只會把圖片指針指向同一塊內存。能夠直接從緩存中取的數據而不用遍歷整個工程.在這種狀況下 imageNamed 的效率仍是很是高的.同一個圖片對象系統只會把它 Cache 到內存一次 , 這對圖像的重複利用是很是有優點的.
你用第二種方式加載的時候 , 圖像會被系統以數據的形式加載到程序 . 當你不須要重用該圖像,或者你須要將圖像以數據方式存儲到數據庫,又或者你要經過網絡下載一個很大的圖像時,請儘可能使用imageWithData的方式加載圖像。
著做權聲明:本文爲做者原創,歡迎轉載分享。請尊重做者勞動,轉載時保留該聲明和做者博客連接,謝謝!