ios weak 源码资料

2020-05-29  本文已影响0人  YM_1

有空整理 摘要

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

上一篇下一篇

猜你喜欢

热点阅读