今天項目組一個同事將jpg放到了resource文件夾中,其實平常我們的圖片資源文件全是在xcassets里面,于是我問他為什么這樣放,他說將jpg的圖片放到xcassets里面,用文件名獲取不到。
UIImage *image = [UIImage imageNamed:@"Twilight1"];
就想這樣。
那到底這是問什么喃?
探尋
來,我們從這個方法進(jìn)去看看,

可以看到api reference中提到了那么這個參數(shù);說到,如果你是第一次調(diào)用這個圖片,這個方法會到main bundle中去尋找這個名字的圖片,但是為什么是第一次喃?
后面才是這一次的重點,如果是PNG格式的圖片,那么你可以忽略擴(kuò)展名,但是其他格式,你需要加上拓展名,這就解釋了為什么獲取不到這張jpg圖片。
而且你在xcassets中的圖片是用imageWithContentsOfFile方法獲取不到的,因為xcassets在打包后會變成car格式的壓縮包。

所以你用并不能用NSbundle的pathForResource等方法獲取到該圖片的路徑。所以,如果你需要用imageWithContentsOfFile方法,你就需要將圖片放到bundle中,而不是xcassets。
于是,你應(yīng)該這么寫
UIImage *image = [UIImage imageNamed:@"Twilight1.jpg"];
第一次?
上面提到了第一次獲取調(diào)用這張圖片,為什么是第一次喃?相信大部分iOS程序猿都知道,因為這個函數(shù)會將獲取到的圖片存到緩存中,下次再次調(diào)用,會直接取到該圖片的緩存。文檔也確實這樣寫道:

不過凡事講證據(jù),證據(jù)來也:

可以看到,在后面確實調(diào)用了NSCache的存儲方法。
然后文檔還說到:
The system may purge cached image data at any time to free up memory. Purging occurs only for images that are in the cache but are not currently being used.
就是說,系統(tǒng)會有可能在任何時候清除內(nèi)存中緩存圖片,在使用中的不受影響。根據(jù)YY大神的測試:“據(jù)我觀察,在圖片解碼后,App 第一次退到后臺和收到內(nèi)存警告時,該圖片的緩存才會被清空,其他情況下緩存會一直存在?!?br> 那么那些方法不會造成圖片的緩存喃?來,看看文檔:
This method does not cache the image object.
- imageWithContentsOfFile:
- imageWithData:scale:
- imageWithCGImage:
-
imageWithCGImage:scale:orientation:
這4種方法在文檔中都寫到不會造成緩存。
看看執(zhí)行的情況:
noCache.png
可以看到是真的沒有進(jìn)行系統(tǒng)緩存。
圖片的decode
最近南峰子大大的微博發(fā)出的關(guān)于UIImage的知識小集中提到了UIImage的解碼,有興趣的可以去看看,并且自己動手試試看。
