ios weak 源碼資料

有空整理 摘要

isa 結構體

hasweaklyref
has coxx
sidetable_rc
refcount

引用計數小 直接存在 isa的 refcount
如果查過極限值 分一半存到 sideTable中

全局一張 sideTables,sideTables 含有固定的 64張 sideTable

sideTable 結構含有
lock 自旋鎖
refcnts 對象引用計數 (對象地址,引用計數)
weakTable (對象弱引用計數)

weakTable_t

weakTable 含有 numCount,含有有多少個 weak 對象
weakTable 含有 entry hash 數組
mask 用于求元素的hash算法需要的值
max_hash_displacement 最大沖突次數

weakTable 容量超過3/4 擴容 2倍 或者 64
容量緊縮 總容量大于 1024,但實際使用不足1/16時,減小容量為 1/8

weak_entry 中
如果小于4個 直接存放四個進入數組
大于四個,分配一個動態(tài)大小的數組,標記啟用動態(tài)數組。
數組擴容 容量超過3/4 擴容 2倍 或者 8 沒有縮小的方法

root_dealloc
判斷是否有c++析構函數
弱引用
綁定對象

調用析構函數
解除綁定
弱引用表 查詢
置為nil

__block

被block捕獲的正常對象 值拷貝
__block 對象會從新生成一個結構體

{
id forwarding
id
}

__block int b = 10

b = 11

b->forwarding->b = 11

block拷貝到堆上,棧中的 forwarding 指向 堆上的地址且所有都替換為
b->forwarding->b

block 中
^{ b = nil } 執(zhí)行完后的代碼中再次執(zhí)行 self
代表 b-> forwarding-> b = nil
b-> forwarding 引用的 b 斷開了鏈接。
b 如果沒有其他引用,就會被 release掉
然后繼續(xù)訪問 b,會訪問一塊廢棄的地址造成 野指針。

文章
Objective-C runtime機制(5)——iOS 內存管理

Objective-C runtime機制(6)——weak引用的底層實現原理

Objective-C runtime機制(7)——SideTables, SideTable, weak_table, weak_entry_t

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容