//方法1 UIImage *imag1 = [UIImage imageNamed:@"image.png"]; //方法2 UIImage *image2 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image.png" ofType:nil]]; //方法3 NSData *imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image.png" ofType:nil]]; UIImage *image3 = [UIImage imageWithData:imageData];
爲何有兩種方法完成一樣的事情呢?imageNamed的優勢在於能夠緩存已經加載的圖片。蘋果的文檔中有以下說法:數組
This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.緩存
這種方法會首先在系統緩存中根據指定的名字尋找圖片,若是找到了就返回。若是沒有在緩存中找到圖片,該方法會從指定的文件中加載圖片數據,並將其緩存起來,而後再把結果返回。對於同一個圖像,系統只會把它Cache到內存一次,這對於圖像的重複利用是很是有優點的。例如:你須要在 一個TableView裏重複加載一樣一個圖標,那麼用imageNamed加載圖像,系統會把那個圖標Cache到內存,在Table裏每次利用那個圖 像的時候,只會把圖片指針指向同一塊內存。這種狀況使用imageNamed加載圖像就會變得很是有效。優化
然而,正是所以使用imageNamed
會緩存圖片,即將圖片的數據放在內存中,iOS的內存很是珍貴而且在內存消耗過大時,會強制釋放內存,即會遇到memory warnings。而在iOS系統裏面釋放圖像的內存是一件比較麻煩的事情,有可能會形成內存泄漏。例如:當一 個UIView對象的animationImages是一個裝有UIImage對象動態數組NSMutableArray,並進行逐幀動畫。當使用imageNamed的方式加載圖像到一個動態數組NSMutableArray,這將會頗有可能形成內存泄露。緣由很顯然的。動畫
imageWithContentsOfFile
:僅加載圖片,圖像數據不會緩存,圖像會被系統以數據方式加載到程序。所以對於較大的圖片以及使用狀況較少時,那就能夠用該方法,下降內存消耗。this
下面列舉出兩種方法的詳細用法:.net
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];
若是加載一張很大的圖片,而且只使用一次,那麼就不須要緩存這個圖片。這種狀況imageWithContentsOfFile比較合適,系統不會浪費內存來緩存圖片。
然而,若是在程序中常常須要重用的圖片,那麼最好是選擇imageNamed方法。這種方法能夠節省出每次都從磁盤加載圖片的時間。code