weak dealloc內部實現

2021-09-12 01:52:04 字數 906 閱讀 1517

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

vector的內部實現

假定你現在已經能熟練使用vector,如果你很好奇vector背後是怎麼實現的,那麼本文或許對你能有所幫助。vector代表了c 的動態陣列,大小是動態可增長的。你不必考慮自己手動分配或釋放記憶體,也不必擔心記憶體洩漏,vector幫你做了這一切。vector的使用很簡單,但是要做到有效率,沒那麼容...

html內部鏈結實現

文字1 西安 古城 世界歷史名城,華夏精神故鄉,中國第一古都 西安 詳細介紹 大理 古城 大理歷史深遠,素有 文獻名邦 美名。大理古城位於風光綺麗的蒼山之麓,始建於明洪武十五年,是中國二十四個歷史文化名城之一。詳細介紹 文字2 大理歷史深遠,素有 文獻名邦 美名。大理古城位於風光綺麗的蒼山之麓,始建...

memcpy,memset內部函式實現

include using namespace std memcpy函式用於資源記憶體 src指向的記憶體 拷貝到目標記憶體 desc指向的記憶體 拷貝的個數size 用法 1 可以拷貝任何型別的物件,因為函式的引數型別是void 由於函式拷貝是乙個位元組乙個 位元組拷貝,實際操作是將void 強制...