載入本地圖片的幾種方式和區別
阿新 • • 發佈:2019-01-25
載入本地圖片在iOS開發中是非常常見的,一般來說,載入本地圖片主要有以下兩種方法,分為兩大類。
一、載入mainBundle的圖片
1、imageNamed
這個方法用一個指定的名字在系統快取中查詢一個圖片物件,如果存在就返回一個圖片物件。如果快取中沒有找到相應的圖片,就從指定的文件中載入然後快取並返回這個物件。
因此imageNamed的優點是當載入時會快取圖片。所以當圖片會頻繁的使用時,那麼用imageNamed的方法會比較好。
例如需要在一個TableView裡的TableViewCell裡都載入同樣一個圖示,那麼用imageNamed載入影象效率很高。系統會把那個圖示Cache到記憶體,在TableViewCell裡每次利用那個影象的時候,只會把圖片指標指向同一塊記憶體。
正是因此使用imageNamed會快取圖片,即將圖片的資料放在記憶體中,iOS的記憶體非常珍貴並且在記憶體消耗過大時,會強制釋放記憶體,即會遇到memory warnings。而在iOS系統裡面釋放影象的記憶體是一件比較麻煩的事情,有可能會造成記憶體洩漏。
例如當一個UIView物件的animationImages是一個裝有UIImage物件動態陣列NSMutableArray,並進行逐幀動畫。當使用imageNamed的方式載入影象到一個動態陣列NSMutableArray,這將會很有可能造成記憶體洩露。
另外,如果載入的是png格式的圖片,則可以省略.png字尾。
2 、imageWithContentsOfFile
這個方法僅載入圖片,影象資料不會快取。
因此對於較大的圖片以及使用情況較少時,那就可以用該方法,降低記憶體消耗。
一般是結合[[NSBundle mainBundle] pathForResource: ofType:];這個方法一起使用。
但是使用[[NSBundle mainBundle] pathForResource: ofType:]這個方法的時候需要注意一點: Assets.xcassets裡面的圖片,不管是jpg還是png都不能用[[NSBundle mainBundle] pathForResource: ofType:]獲取,只能用[UIImage imageNamed:]獲取。
而在工程目錄下的圖片,既可以用[[NSBundle mainBundle] pathForResource: ofType:]獲取,也能用[UIImage imageNamed:]獲取。
二、載入custom Bundle的圖片 這裡得分兩種情況,一種是真實的bundle(建立的字尾為.bundle的檔案),另一種是framework(建立的字尾為.framework的檔案) ps:其實framework也是一種bundle,所以一開始我也是按照從custom bundle裡獲取圖片的方面從framework獲取圖片,但是卻發現一直獲取不到,最後才發現,兩者是有一些區別的,具體區別請看下面分析 1、主工程中載入custom bundle裡的圖片 在這之前,順便簡單說下自custom bundle的建立 在工程裡command + n,再按圖示操作
往Resources.bundle新增加圖片,直接將圖片拖拽到目錄下,然後按下圖方式載入圖片
2、主工程中載入custom framework裡的圖片 在這之前,順便簡單說下自custom framework的建立 按下圖操作
注意,建立好framework後,如果想訪問裡面的資源,需要先將framework載入起來,按下圖操作
另外,如果想訪問framework裡其他資源,比如裡面的UIViewController,需執行下面操作
接下來就是載入customFramework裡面的圖片,有以下兩種方式
3、custom framework中載入custom framework裡的圖片 有以下幾種方法
總結: 1、imageNamed載入圖片時會在記憶體中快取圖片,適用於 1)、主工程中載入mainBundle的圖片 2)、主工程中載入Assets.xcassets的圖片 3)、custom Framework中載入custom Framework的圖片 2、imageWithContentsOfFile載入圖片時不會在記憶體中快取圖片,一般跟 [bundle pathForResource:ofType:]一起使用,適用於 1)、主工程中載入mainBundle的圖片 2)、主工程中載入custom Framework的圖片 3)、 custom Framework中載入custom Framework的圖片
2 、imageWithContentsOfFile
二、載入custom Bundle的圖片 這裡得分兩種情況,一種是真實的bundle(建立的字尾為.bundle的檔案),另一種是framework(建立的字尾為.framework的檔案) ps:其實framework也是一種bundle,所以一開始我也是按照從custom bundle裡獲取圖片的方面從framework獲取圖片,但是卻發現一直獲取不到,最後才發現,兩者是有一些區別的,具體區別請看下面分析 1、主工程中載入custom bundle裡的圖片 在這之前,順便簡單說下自custom bundle的建立 在工程裡command + n,再按圖示操作
往Resources.bundle新增加圖片,直接將圖片拖拽到目錄下,然後按下圖方式載入圖片
2、主工程中載入custom framework裡的圖片 在這之前,順便簡單說下自custom framework的建立 按下圖操作
注意,建立好framework後,如果想訪問裡面的資源,需要先將framework載入起來,按下圖操作
另外,如果想訪問framework裡其他資源,比如裡面的UIViewController,需執行下面操作
接下來就是載入customFramework裡面的圖片,有以下兩種方式
3、custom framework中載入custom framework裡的圖片 有以下幾種方法
總結: 1、imageNamed載入圖片時會在記憶體中快取圖片,適用於 1)、主工程中載入mainBundle的圖片 2)、主工程中載入Assets.xcassets的圖片 3)、custom Framework中載入custom Framework的圖片 2、imageWithContentsOfFile載入圖片時不會在記憶體中快取圖片,一般跟 [bundle pathForResource:ofType:]一起使用,適用於 1)、主工程中載入mainBundle的圖片 2)、主工程中載入custom Framework的圖片 3)、 custom Framework中載入custom Framework的圖片