有空整理 摘要
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