今天項(xiàng)目組一個(gè)同事將jpg放到了resource文件夾中就珠,其實(shí)平常我們的圖片資源文件全是在xcassets里面玩焰,于是我問(wèn)他為什么這樣放,他說(shuō)將jpg的圖片放到xcassets里面着饥,用文件名獲取不到隆檀。
UIImage *image = [UIImage imageNamed:@"Twilight1"];
就想這樣。
那到底這是問(wèn)什么喃蒲讯?
探尋
來(lái)忘朝,我們從這個(gè)方法進(jìn)去看看,
可以看到api reference中提到了那么這個(gè)參數(shù)判帮;說(shuō)到局嘁,如果你是第一次調(diào)用這個(gè)圖片,這個(gè)方法會(huì)到main bundle中去尋找這個(gè)名字的圖片晦墙,但是為什么是第一次喃悦昵?
后面才是這一次的重點(diǎn),如果是PNG格式的圖片晌畅,那么你可以忽略擴(kuò)展名但指,但是其他格式,你需要加上拓展名抗楔,這就解釋了為什么獲取不到這張jpg圖片棋凳。
而且你在xcassets中的圖片是用imageWithContentsOfFile方法獲取不到的,因?yàn)閤cassets在打包后會(huì)變成car格式的壓縮包连躏。
所以你用并不能用NSbundle的pathForResource等方法獲取到該圖片的路徑剩岳。所以,如果你需要用imageWithContentsOfFile方法入热,你就需要將圖片放到bundle中卢肃,而不是xcassets。
于是才顿,你應(yīng)該這么寫(xiě)
UIImage *image = [UIImage imageNamed:@"Twilight1.jpg"];
第一次莫湘?
上面提到了第一次獲取調(diào)用這張圖片,為什么是第一次喃郑气?相信大部分iOS程序猿都知道幅垮,因?yàn)檫@個(gè)函數(shù)會(huì)將獲取到的圖片存到緩存中,下次再次調(diào)用尾组,會(huì)直接取到該圖片的緩存忙芒。文檔也確實(shí)這樣寫(xiě)道:
不過(guò)凡事講證據(jù)示弓,證據(jù)來(lái)也:
可以看到,在后面確實(shí)調(diào)用了NSCache的存儲(chǔ)方法呵萨。
然后文檔還說(shuō)到:
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.
就是說(shuō)奏属,系統(tǒng)會(huì)有可能在任何時(shí)候清除內(nèi)存中緩存圖片,在使用中的不受影響潮峦。根據(jù)YY大神的測(cè)試:“據(jù)我觀察囱皿,在圖片解碼后,App 第一次退到后臺(tái)和收到內(nèi)存警告時(shí)忱嘹,該圖片的緩存才會(huì)被清空嘱腥,其他情況下緩存會(huì)一直存在【性茫”
那么那些方法不會(huì)造成圖片的緩存喃齿兔?來(lái),看看文檔:
This method does not cache the image object.
- imageWithContentsOfFile:
- imageWithData:scale:
- imageWithCGImage:
-
imageWithCGImage:scale:orientation:
這4種方法在文檔中都寫(xiě)到不會(huì)造成緩存础米。
看看執(zhí)行的情況:
noCache.png
可以看到是真的沒(méi)有進(jìn)行系統(tǒng)緩存分苇。
圖片的decode
最近南峰子大大的微博發(fā)出的關(guān)于UIImage的知識(shí)小集中提到了UIImage的解碼,有興趣的可以去看看屁桑,并且自己動(dòng)手試試看医寿。