iOS weak 自動置為nil的實現

2021-09-24 18:59:10 字數 440 閱讀 9606

runtime 維護了乙個weak表,weak_table_t

用於儲存指向某乙個物件的所有weak指標。weak表其實是乙個雜湊表,

key是所指物件的位址,value是weak指標的位址的陣列。

在物件**的時候,就會在weak表中進行搜尋,找到所有以這個物件位址為鍵值的weak物件,從而置位nil。

2.1 初始化步驟

runtime 會呼叫objc_initweak,初始化乙個新的weak指標指向物件的位址。

2.2 新增引用的步驟

objc_initweak 函式會呼叫 objc_storeweak 函式,這個函式的作用是更新指標指向,建立對應的弱引用表

2.3 釋放的時候

最後一步是觸發呼叫arr_clear_deallocating 函式 ,根據物件的位址將所有weak指標位址的陣列,遍歷陣列把其中的資料置為nil。

weak 自動置nil機制

一 實現 runtime在註冊類時,會布局乙個weak表 hash表 key是所指物件的位址,value是weak指標的位址的陣列 當物件釋放時,層層呼叫後,通過arr clear deallocating釋放 二 weak實現原理步驟 通過clang可以分析原始碼 objc initweak 初始...

C語言位運算之求位元組中被置為1的個數

題目 請編寫乙個c函式,該函式給出乙個位元組中被置為1的位的個數 void statistics char ch ch ch 1 printf count d n count int main 總結 對於位運算來說,這題是一道很基礎的題。首先我們知道乙個位元組佔了8位,所以題目中要我們找乙個位元組中...

FMX中TLabel設定為自動長度的問題

今天有人說到在fmx裡,tlabel設定autosize true,控制項大小不變 平常也沒太注意這樣的情況,以前vcl下這樣設定後,label顯示出來的會根據內容自動變更長度的,不會留出一段空白,然而fmx畢竟與vcl不同,多了很多的樣式屬性,所以也應該會有些區別。於是我建了乙個空專案測試。按照常...