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”]; NSData *image = [NSData dataWithContentsOfFile:filePath]; UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];
再次強調兩種用法各有各的優點,需要針對具體的應用場景來使用他們。