溪石iOS是原創(chuàng)文章,非授權(quán)請(qǐng)勿轉(zhuǎn)載,但是歡迎你評(píng)論轉(zhuǎn)發(fā)呦,WOW!
問(wèn)題一:App重啟后,NSCache中的東西還存在嗎?
一聽到緩存數(shù)據(jù),我們腦海里立馬浮現(xiàn)了《印象筆記》這樣“理所當(dāng)然”的功能:在WIFI環(huán)境中保存過(guò)的網(wǎng)絡(luò)文章,在沒(méi)有網(wǎng)絡(luò)時(shí)(比如出門在外,關(guān)閉4G),看過(guò)的文章可以繼續(xù)閱讀,并不受網(wǎng)絡(luò)關(guān)閉的影響。
NSCache可以幫助我們實(shí)現(xiàn)這樣的功能嗎?
并不能!??!
NSCache中的數(shù)據(jù)在APP重啟(或重新init)后,都消失了,并不會(huì)保存下來(lái)。
也就是說(shuō),NSCache的正確名字應(yīng)該叫做NSMemoryCache,只是將數(shù)據(jù)保存在內(nèi)存中。
問(wèn)題二:可以統(tǒng)計(jì)出NSCache中已經(jīng)緩存的數(shù)據(jù)大小嗎?
答案依然是否
我們可以使用 countLimit
指定緩存中保存的對(duì)象數(shù)量,
或用 totalCostLimit
屬性 +
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)num
方法,勉強(qiáng)實(shí)現(xiàn)占用內(nèi)存的控制。
注意:cost并沒(méi)有說(shuō)明必須等于對(duì)象占用的字節(jié)數(shù)。
這意味NSCache到底占用了多少內(nèi)存,是使用者(就是苦逼的我們)自己計(jì)算的!
NSCache奇葩之處三:釋放內(nèi)存時(shí),并不確定釋放的對(duì)象的順序。
這是什么意思呢?假設(shè)我們基于NSCache實(shí)現(xiàn)一個(gè)無(wú)限上拉的列表,當(dāng)上拉到某一頁(yè),我們存入了當(dāng)前頁(yè)的數(shù)據(jù)對(duì)象,結(jié)果觸發(fā)了內(nèi)存警告,NSCache會(huì)自動(dòng)釋放,結(jié)果可能是剛存入的數(shù)據(jù)對(duì)象被清理了,而不是我們希望的“先進(jìn)先出”順序。
相信讀到這里,有些童鞋已經(jīng)出離憤怒了:這個(gè)奇葩緩存有什么用?
NSCache 是線程安全的
很多童鞋第一次實(shí)現(xiàn)TableView時(shí),都會(huì)使用NSMutableArray當(dāng)數(shù)據(jù)源,當(dāng)實(shí)現(xiàn)下拉刷新時(shí),何時(shí)清理這個(gè)數(shù)組就很重要了,如果TableView正在刷新,而數(shù)組又被清掉時(shí),就會(huì)導(dǎo)致數(shù)組越界訪問(wèn)而崩潰,而使用NSCache就不會(huì)有此問(wèn)題。
結(jié)合NSDiscardableContent協(xié)議使用
實(shí)現(xiàn)了這個(gè)協(xié)議的類需要在被引用之前,必須調(diào)用beginContentAccess來(lái)標(biāo)記為可使用的,如果在使用之前沒(méi)有調(diào)用beiginContentAccess,那么就會(huì)拋出異常。在使用結(jié)束之后,調(diào)用endContentAccess,來(lái)標(biāo)記它為可以被釋放的。如果實(shí)現(xiàn)了NSDiscardableContent協(xié)議的對(duì)象放入了NSCache中,那么,在清除它的時(shí)候,會(huì)調(diào)用discardContentIfPossible方法來(lái)判斷引用狀況,沒(méi)有引用,則銷毀。
這樣,我們就可以很“精確”地控制對(duì)象的釋放,配合NSCache的內(nèi)存自動(dòng)釋放,達(dá)到既釋放過(guò)期數(shù)據(jù)的目的,又不用擔(dān)心對(duì)象過(guò)早被釋放,如果另外實(shí)現(xiàn)這樣的效果,需要做數(shù)據(jù)有效性判斷,當(dāng)然是費(fèi)時(shí)費(fèi)力。
另外,NSCache的KEY是不需要遵循NSCopying協(xié)議的,也就是說(shuō),作為KEY的對(duì)象并不會(huì)被拷貝,利用這點(diǎn),可以做出一些NSDictionary無(wú)法實(shí)現(xiàn)的效果,請(qǐng)關(guān)注溪石iOS,了解更多開發(fā)技巧。
1.《ios開發(fā)如何做緩存處理》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《ios開發(fā)如何做緩存處理》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/keji/3228264.html