轉:數組
Apple官方的文檔爲生成一個UIImage對象提供了兩種方法:緩存
1. imageNamed,其參數爲圖片的名字;app
2. imageWithContentsOfFile,其參數也是圖片文件的路徑。動畫
那麼兩種有什麼區別嗎?spa
確定是有的。根據Apple的官方文檔:.net
imageNamed
: 這個方法用一個指定的名字在系統緩存中查找並返回一個圖片對象若是它存在的話。若是緩存中沒有找到相應的圖片,這個方法從指定的文檔中加載而後緩存並返回這個對象。所以imageNamed
的優勢是當加載時會緩存圖片。因此當圖片會頻繁的使用時,那麼用imageNamed
的方法會比較好。例如:你須要在 一個TableView裏的TableViewCell裏都加載一樣一個圖標,那麼用imageNamed加載圖像效率很高。系統會把那個圖標Cache到內存,在TableViewCell裏每次利用那個圖 像的時候,只會把圖片指針指向同一塊內存。正是所以使用imageNamed
會緩存圖片,即將圖片的數據放在內存中,iOS的內存很是珍貴而且在內存消耗過大時,會強制釋放內存,即會遇到memory warnings。而在iOS系統裏面釋放圖像的內存是一件比較麻煩的事情,有可能會形成內存泄漏。例如:當一 個UIView對象的animationImages是一個裝有UIImage對象動態數組NSMutableArray,並進行逐幀動畫。當使用imageNamed的方式加載圖像到一個動態數組NSMutableArray,這將會頗有可能形成內存泄露。緣由很顯然的。指針
imageWithContentsOfFile
:僅加載圖片,圖像數據不會緩存。所以對於較大的圖片以及使用狀況較少時,那就能夠用該方法,下降內存消耗。code
下面列舉出兩種方法的詳細用法:orm
NSString *path = [[NSBundle mainBundle] pathForResource:@」icon」 ofType:@」png」]; 對象
UIImage *image = [UIImage imageWithContentsOfFile:path];
以及:
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:「png」];
NSData *image = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];
再次強調兩種用法各有各的優勢,須要針對具體的應用場景來使用他們。