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凿可。