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个 直接存放四个进入数组
大于四个,分配一个动态大小的数组,标记启用动态数组。
数组扩容 容量超过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 } 执行完后的代码中再次执行 self
代表 b-> forwarding-> b = nil
b-> forwarding 引用的 b 断开了链接。
b 如果没有其他引用,就会被 release掉
然后继续访问 b,会访问一块废弃的地址造成 野指针。
文章
Objective-C runtime机制(5)——iOS 内存管理
Objective-C runtime机制(6)——weak引用的底层实现原理
Objective-C runtime机制(7)——SideTables, SideTable, weak_table, weak_entry_t