weak防止循環(huán)引用的原理

weak指針指向的值為nil時(shí),指針會(huì)自動(dòng)釋放但為什么呢?

用OC的理解就是在全局有一個(gè)CFMutableDictionary類似哈希表 ,來存放所有weak修飾的鍵值對
Key:對象地址
value:指針變量地址(因存在多個(gè),是集合類型)
當(dāng)對象調(diào)用dealloc的時(shí)候,就會(huì)去weak表中,以釋放對象的地址為key去weak表中檢索,將對應(yīng)的指針變量地址制為nil,將weak表中該key對應(yīng)的該條記錄刪除.(因調(diào)用哈希表的增刪改查,需要消耗一些性能CPU,所以如果大量使用weak的話,就會(huì)影響CPU的性能).

附錄: WeakHashMap原理

WeakHashMap 繼承于AbstractMap,實(shí)現(xiàn)了Map接口。
和HashMap一樣惠险,WeakHashMap 也是一個(gè)散列表久锥,它存儲(chǔ)的內(nèi)容也是鍵值對(key-value)映射饱亮,而且鍵和值都可以是null歹叮。
不過WeakHashMap的鍵是“弱鍵”。在 WeakHashMap 中盯串,當(dāng)某個(gè)鍵不再正常使用時(shí)娇唯,會(huì)被從WeakHashMap中被自動(dòng)移除齐遵。更精確地說,對于一個(gè)給定的鍵塔插,其映射的存在并不阻止垃圾回收器對該鍵的丟棄梗摇,這就使該鍵成為可終止的,被終止想许,然后被回收伶授。某個(gè)鍵被終止時(shí),它對應(yīng)的鍵值對也就從映射中有效地移除了流纹。
這個(gè)“弱鍵”的原理呢糜烹?大致上就是,通過WeakReference和ReferenceQueue實(shí)現(xiàn)的漱凝。 WeakHashMap的key是“弱鍵”疮蹦,即是WeakReference類型的;ReferenceQueue是一個(gè)隊(duì)列碉哑,它會(huì)保存被GC回收的“弱鍵”挚币。實(shí)現(xiàn)步驟是:
(01) 新建WeakHashMap,將“鍵值對”添加到WeakHashMap中扣典。
實(shí)際上妆毕,WeakHashMap是通過數(shù)組table保存Entry(鍵值對);每一個(gè)Entry實(shí)際上是一個(gè)單向鏈表贮尖,即Entry是鍵值對鏈表笛粘。
(02) 當(dāng)某“弱鍵”不再被其它對象引用,并被GC回收時(shí)湿硝。在GC回收該“弱鍵”時(shí)薪前,這個(gè)“弱鍵”也同時(shí)會(huì)被添加到ReferenceQueue(queue)隊(duì)列中。
(03) 當(dāng)下一次我們需要操作WeakHashMap時(shí)关斜,會(huì)先同步table和queue示括。table中保存了全部的鍵值對,而queue中保存被GC回收的鍵值對痢畜;同步它們垛膝,就是刪除table中被GC回收的鍵值對。
這就是“弱鍵”如何被自動(dòng)從WeakHashMap中刪除的步驟了丁稀。

和HashMap一樣吼拥,WeakHashMap是不同步的∠呱溃可以使用 Collections.synchronizedMap 方法來構(gòu)造同步的 WeakHashMap凿可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市授账,隨后出現(xiàn)的幾起案子枯跑,更是在濱河造成了極大的恐慌,老刑警劉巖矗积,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件全肮,死亡現(xiàn)場離奇詭異,居然都是意外死亡棘捣,警方通過查閱死者的電腦和手機(jī)辜腺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乍恐,“玉大人评疗,你說我怎么就攤上這事∫鹆遥” “怎么了百匆?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呜投。 經(jīng)常有香客問我加匈,道長存璃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任雕拼,我火速辦了婚禮纵东,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啥寇。我一直安慰自己偎球,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布辑甜。 她就那樣靜靜地躺著衰絮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷醋。 梳的紋絲不亂的頭發(fā)上猫牡,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音邓线,去河邊找鬼镊掖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛褂痰,可吹牛的內(nèi)容都是我干的亩进。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缩歪,長吁一口氣:“原來是場噩夢啊……” “哼归薛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匪蝙,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤主籍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逛球,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體千元,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年颤绕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幸海。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奥务,死狀恐怖物独,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氯葬,我是刑警寧澤挡篓,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帚称,受9級特大地震影響官研,放射性物質(zhì)發(fā)生泄漏秽澳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一戏羽、第九天 我趴在偏房一處隱蔽的房頂上張望肝集。 院中可真熱鬧,春花似錦蛛壳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浮创,卻和暖如春忧吟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斩披。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工溜族, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垦沉。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓煌抒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厕倍。 傳聞我的和親對象是個(gè)殘疾皇子寡壮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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