weak、dealloc內部實現

weak

經過編譯會調用以下兩方法,
objc_initWeak
storeWeak
weak_register_no_lock
在內部先通過操作後(如判空、deallocating、isTaggedPointer),調用
weak_entry_for_referent獲取 weak_entry_t (內部通過哈希查找&散列表的mask得到index,從弱引用表entiries[index]內取出地址和目標做比較,相等就直接返回,不等就index+1,繼續往下偏移計算。)
類型的結構體entry,若有就把新的弱引用指針添加進入該結構體內的referrers或inline_referrers數組內;否則就新創建個
weak_entry_t 結構體類型,然後把弱引用指針加入結構體內部的可變數組內。這樣也就加入到弱引用列表內了。

dealloc

_objc_rootDealloc
rootDealloc
經過一些列判斷,如是否有關聯對象、析構函數、非指針型isa、弱引用指針、散列表等,如無,調用c的free釋放,結束。如有
調用object_dispose,內部調用objc_destructInstance將關聯對象、析構函數移除掉。再調用clearDeallocating,再其內調用
weak_clear_no_lock,其內部先調用
weak_entry_for_referent獲取 weak_entry_t (,內部通過哈希查找&散列表的mask得到index,從弱引用表entiries[index]內取出地址和目標做比較,相等就直接返回,不等就index+1,繼續往下偏移計算。)
類型的結構體entry,根據entry計算出元素個數,拿出可變數組,遍歷可變數組,判斷該數組內的弱引用指針是否和當前目標對象地址一致,一致就將該遍歷出來的指針置爲nil

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章