iOS 載入圖片選擇imageNamed 方法還是 imageWithContentsOfFile?
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];
再次強調兩種使用方法各有各的長處,須要針對具體的應用場景來使用他們。