SDWebImage緩存幾個(gè)疑問(wèn)

SDWebImage异吻,有內(nèi)存和磁盤兩個(gè)緩存。內(nèi)存緩存中尔许,SDWebImage自己提供了默認(rèn)的內(nèi)存緩存類 SDMemoryCache么鹤。但是發(fā)覺(jué)這個(gè)類有幾個(gè)沒(méi)看明白。其繼承自NSCache母债。但是自己還有一個(gè)weakcache的屬性午磁。而且還是一個(gè)NSMapTable集合。

這有兩個(gè)問(wèn)題毡们,一這個(gè)weakCache是干什么迅皇,二為什么要用NSMapTable。

后來(lái)想了一下衙熔,這個(gè)應(yīng)該是保證內(nèi)存告警之后登颓,在NSCache緩存全部釋放之后,緩存對(duì)象沒(méi)有真正被釋放的緩存對(duì)象還可以通過(guò)key來(lái)讀取緩存數(shù)據(jù)红氯。

比如一個(gè)對(duì)象a框咙,a在某個(gè)頁(yè)面被強(qiáng)持有咕痛,然后同時(shí)放到一個(gè)內(nèi)存緩存SDMemoryCache(即NSCache)中,之后可以讓別人可以通過(guò)a_key來(lái)取緩存喇嘱。

但是app使用了一段時(shí)間之后內(nèi)存增加茉贡,收到了告警,這時(shí)候SDMemoryCache的操作是直接簡(jiǎn)單粗暴removeAllObject者铜,即remove父類NSCache中所有的內(nèi)容腔丧。見(jiàn)下圖

remove之后之后通過(guò)a_key查找緩存就查找不到了。但是a因?yàn)楸豁?yè)面強(qiáng)持有作烟,那么a并沒(méi)有真正釋放愉粤。緩存對(duì)象還是在內(nèi)存中存在的,但只是通過(guò)key卻查找不到了拿撩,這么看是不符合預(yù)期的衣厘。

所以針對(duì)這種情況下,可以在NSCache之外压恒,再建立一個(gè)key-value的映射表影暴,延長(zhǎng)緩存的映射表生命周期。但是這個(gè)額外的映射表他只是保證上述那種緩存并沒(méi)有真正釋放情況下涎显,延續(xù)映射關(guān)系坤检。所以使用了NSMapTable兴猩。即期吓,

一:不能在NSCache之外還強(qiáng)持有緩存對(duì)象,保證不污染原本的緩存對(duì)象生命周期倾芝。

二:只在如上述中a沒(méi)有被釋放情況下讨勤,保存key-value映射,如果value釋放了晨另,那么NSMapTable中的這個(gè)key-value映射就沒(méi)了潭千。

這種情況下,就不能使用NSDictionary借尿,需要使用NSMapTable了刨晴。

那么又有一個(gè)問(wèn)題,為什么收到內(nèi)存告警路翻,SDMemoryCache直接[super removeAllObject]狈癞?NSCache不自己處理緩存么?

NSCache自己的緩存策略是什么呢茂契?

NSCache有自己的緩存策略蝶桶,不是像上面這種簡(jiǎn)單粗暴直接remove。官網(wǎng)文檔描述掉冶,是一個(gè)智能的策略(見(jiàn)官方文檔

蘋果的描述如下:

The?NSCache?class incorporates various auto-eviction policies, which ensure that a cache doesn’t use too much of the system’s memory. If memory is needed by other applications, these policies remove some items from the cache, minimizing its memory footprint.

然后我找了一下swift開(kāi)源中真竖,NSCache的實(shí)現(xiàn)脐雪。

https://github.com/apple/swift-corelibs-foundation/blob/master/Sources/Foundation/NSCache.swift

從上圖可知,NSCache清理緩存恢共,是根據(jù)我們預(yù)設(shè)的緩存最大值做為閾值战秋,之后每次添加新的緩存對(duì)象之后,判斷當(dāng)前緩存的總尺寸是否已經(jīng)超過(guò)了總量閾值讨韭。如果超過(guò)获询,則從最早添加的緩存對(duì)象開(kāi)始,依次移除拐袜,直到又依次滿足總量的閾值吉嚣。所以NSCache控制內(nèi)存的過(guò)程,就是一個(gè)簡(jiǎn)單粗暴的根據(jù)閾值做處理的邏輯蹬铺。沒(méi)什么智能可言尝哆,也沒(méi)有處理內(nèi)存告警。

所以到了SDMemoryCache中甜攀,才會(huì)又他自己處理內(nèi)存告警的邏輯秋泄,還有相應(yīng)的weakCache邏輯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末规阀,一起剝皮案震驚了整個(gè)濱河市恒序,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谁撼,老刑警劉巖歧胁,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異厉碟,居然都是意外死亡喊巍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門箍鼓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崭参,“玉大人,你說(shuō)我怎么就攤上這事款咖『文海” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵铐殃,是天一觀的道長(zhǎng)海洼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)背稼,這世上最難降的妖魔是什么贰军? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上词疼,老公的妹妹穿的比我還像新娘俯树。我一直安慰自己,他們只是感情好贰盗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布许饿。 她就那樣靜靜地躺著,像睡著了一般舵盈。 火紅的嫁衣襯著肌膚如雪陋率。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天秽晚,我揣著相機(jī)與錄音瓦糟,去河邊找鬼。 笑死赴蝇,一個(gè)胖子當(dāng)著我的面吹牛菩浙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播句伶,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼劲蜻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了考余?” 一聲冷哼從身側(cè)響起先嬉,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楚堤,沒(méi)想到半個(gè)月后疫蔓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钾军,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年鳄袍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绢要。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吏恭。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖重罪,靈堂內(nèi)的尸體忽然破棺而出樱哼,到底是詐尸還是另有隱情,我是刑警寧澤剿配,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布搅幅,位于F島的核電站,受9級(jí)特大地震影響呼胚,放射性物質(zhì)發(fā)生泄漏茄唐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沪编。 院中可真熱鬧呼盆,春花似錦、人聲如沸蚁廓。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)相嵌。三九已至腿时,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饭宾,已是汗流浹背批糟。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留看铆,地道東北人跃赚。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像性湿,于是被迫代替她去往敵國(guó)和親纬傲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容