weak的實現原理

2021-08-16 11:20:51 字數 1093 閱讀 7502

實現 weak

weak 的作用

weak關鍵字的作用弱引用,所引用物件的計數器不會加一,並在引用物件被釋放的時候自動被設定為nil

如何實現 weak

整個系統中存在很多個物件,這些物件都可能會被弱引用,那麼我們需要乙個容器來容納這些被弱引用的物件,比如陣列,在此將這個容器的資料結構標識為objectcontainerdatastructure

乙個物件可能會被多次弱引用,當這個物件被銷毀時,我們需要找到這個物件的所有弱引用,所以我們需要將這些弱引用的位址(即指標)放在乙個容器裡,比如陣列,在此將這些弱引用的位址的資料結構標識為pointercontainerdatastructure

當物件不再被強引用時需要銷毀的時候,我們需要通過這個物件在objectcontainerdatastructure找到其對應的pointercontainerdatastructure,進而找到這個物件的所有弱引用,將其置為nil

通過上面的步驟,我們大概可以得出這麼乙個資料結構:

pointercontainerdatastructure僅僅只是容納乙個物件的所有弱引用的位址,所以用陣列即可;

objectcontainerdatastructure是乙個key-value資料結構,將物件作為key,物件的記憶體位址是最好的選擇;

ios中常用的key-value資料結構就是字典dictionary,在這裡我們的key是乙個數值物件,value則是乙個數值陣列物件,可以用雜湊表實現;

總結為了實現weak,我們需要這樣的一張弱引用表:

表的資料結構是雜湊表;

表的key是物件的記憶體位址;

value是指向該物件的所有弱引用的指標;

IOS 開發 weak內部原理

weak表其實是乙個hash 雜湊 表,key是所指物件的位址,value是weak指標的位址陣列。weak 的實現原理可以概括一下三步 1 初始化時 runtime會呼叫objc initweak函式,初始化乙個新的weak指標指向物件的位址。2 新增引用時 objc initweak函式會呼叫 ...

iOS Runtime實現weak屬性

weak的特點 同assign一樣,是一種非持有關係,不同在於當屬性所指物件被釋放後,屬性值也會自動清空。ps assign 可以用非 oc 物件,而 weak 必須用於 oc 物件 如何實現?當你初始化乙個weak變數的時候,runtime會呼叫objc initweak id object,id...

Weak 原理 個人學習總結

weak簡單來說是乙個雜湊表,key為修飾物件的位址,value為指向該位址的指標陣列。weak是由runtime初始化並維護的乙個weak表。在runtime的原始碼中由乙個objc weak檔案中進行定義了weak表的結構體及相關的方法。其中結構體中定義可乙個table weak t的乙個wea...