Apple官方的文檔為生成一個UIImage對象提供了兩種方法加載圖片:
1. imageNamed,其參數為圖片的名字;
2. imageWithContentsOfFile,其參數也是圖片文件的路徑。
那么兩種有什么區別嗎?
肯定是有的。根據Apple的官方文檔:
imageNamed: 這個方法用一個指定的名字在系統緩存中查找並返回一個圖片對象如果它存在的話。如果緩存中沒有找到相應的圖片,這個方法從指定的文檔中加載然后緩存並返回這個對象。因此imageNamed的優點是當加載時會緩存圖片。所以當圖片會頻繁的使用時,那么用imageNamed的方法會比較好。例如:你需要在 一個TableView里的TableViewCell里都加載同樣一個圖標,那么用imageNamed加載圖像效率很高。系統會把那個圖標Cache到內存,在TableViewCell里每次利用那個圖像的時候,只會把圖片指針指向同一塊內存。正是因此使用imageNamed會緩存圖片,即將圖片的數據放在內存中,iOS的內存非常珍貴並且在內存消耗過大時,會強制釋放內存,即會遇到memory warnings。而在iOS系統里面釋放圖像的內存是一件比較麻煩的事情,有可能會造成內存泄漏。例如:當一個UIView對象的animationImages是一個裝有UIImage對象動態數組NSMutableArray,並進行逐幀動畫。當使用imageNamed的方式加載圖像到一個動態數組NSMutableArray,這將會很有可能造成內存泄露。原因很顯然的。
imageWithContentsOfFile:僅加載圖片,圖像數據不會緩存。因此對於較大的圖片以及使用情況較少時,那就可以用該方法,降低內存消耗。
下面列舉出兩種方法的詳細用法:
NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
UIImage *image = [UIImage imageWithContentsOfFile:path];
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
//或者
//
NSData *image = [NSData dataWithContentsOfFile:filePath];
//
UIImage *image = [UIImage imageWithData:image];
imageNamed:先將圖片緩存到內存中,然后在顯示。
imageWithContentsOfFile:僅加載圖片,圖像數據不會緩存。
總得來說,使用大的圖片,如果不是常用,那么用 imagewithcontentsoffile 方法,比較小的(比如圖標),需要經常使用的,那么用后者,imageNamed 加載,內存常駐,效率高,但是會放在內存里作為cache,圖片多了容易導致crash。