iOS 正确选择图片加载方式
正確選擇圖片加載方式能夠?qū)?nèi)存優(yōu)化起到很大的作用,常見的圖片加載方式有下面三種:
//方法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:
為什么有兩種方法完成同樣的事情呢?imageNamed的優(yōu)點在于可以緩存已經(jīng)加載的圖片。蘋果的文檔中有如下說法:
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.
這種方法會首先在系統(tǒng)緩存中根據(jù)指定的名字尋找圖片,如果找到了就返回。如果沒有在緩存中找到圖片,該方法會從指定的文件中加載圖片數(shù)據(jù),并將其緩存起來,然后再把結(jié)果返回。對于同一個圖像,系統(tǒng)只會把它Cache到內(nèi)存一次,這對于圖像的重復利用是非常有優(yōu)勢的。例如:你需要在 一個TableView里重復加載同樣一個圖標,那么用imageNamed加載圖像,系統(tǒng)會把那個圖標Cache到內(nèi)存,在Table里每次利用那個圖 像的時候,只會把圖片指針指向同一塊內(nèi)存。這種情況使用imageNamed加載圖像就會變得非常有效。
然而,正是因此使用imageNamed會緩存圖片,即將圖片的數(shù)據(jù)放在內(nèi)存中,iOS的內(nèi)存非常珍貴并且在內(nèi)存消耗過大時,會強制釋放內(nèi)存,即會遇到memory warnings。而在iOS系統(tǒng)里面釋放圖像的內(nèi)存是一件比較麻煩的事情,有可能會造成內(nèi)存泄漏。例如:當一 個UIView對象的animationImages是一個裝有UIImage對象動態(tài)數(shù)組NSMutableArray,并進行逐幀動畫。當使用imageNamed的方式加載圖像到一個動態(tài)數(shù)組NSMutableArray,這將會很有可能造成內(nèi)存泄露。原因很顯然的。
第二種方法和第三種方法本質(zhì)是一樣的:imageWithContentsOfFile:和imageWithData:?
imageWithContentsOfFile:僅加載圖片,圖像數(shù)據(jù)不會緩存,圖像會被系統(tǒng)以數(shù)據(jù)方式加載到程序。因此對于較大的圖片以及使用情況較少時,那就可以用該方法,降低內(nèi)存消耗。
下面列舉出兩種方法的詳細用法:
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比較合適,系統(tǒng)不會浪費內(nèi)存來緩存圖片。
然而,如果在程序中經(jīng)常需要重用的圖片,那么最好是選擇imageNamed方法。這種方法可以節(jié)省出每次都從磁盤加載圖片的時間。
轉(zhuǎn)載于:https://www.cnblogs.com/Mr-Lin/p/5802745.html
總結(jié)
以上是生活随笔為你收集整理的iOS 正确选择图片加载方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIView的属性使用
- 下一篇: JavaScript强化教程——Java