ios底层原理

ios-弱引用

2022-08-12  本文已影响0人  erlich

在了解弱引用之前,需要先了解散列表的知识

ios-散列表

经常会在oc中使用 __weak typeof(id) weakSelf = self

weakSelf 加入到弱引用表

此时 self 引用计数为 1

weakSelf 引用计数为 2

也就是 加入弱引用表之后,是不影响引用计数的

测试下 weak 引用计数

image.png

实际测试结果 与开始的有出入,差别在于 weakObject 的引用计数为3,不是2

那么久从这个区别开始 探究 弱引用

弱引用表

通过汇编查看__weak 底层调用

image.png

到libobjc 源码中查看

image.png

查看storeWeak(location, newObj)

location 就是weakObjc newObj 为 objc

image.png

根据object 获取散列表的过程,在 ios-散列表 中有介绍,具体细节可以去查看

StripedMap[hash(objc指针)] -> SideTable

SideTable.weak_table -> weak_table_t

image.png image.png

继续回到 storeWeak 关键逻辑

image.png image.png image.png

具体弱引用表结构的访问

分析 __weakObj 引用计数为3 非2的问题

StripedMap[hash(objc)].weak_table.weak_entries[hash(objc)].referent

弱引用表中 referent 指向objc 堆内存空间,是不是就导致引用计数 +1 ?

image.png image.png

先获取局部变量obj,传递给 弱引用表,此时obj引用计数为2

但obj为局部变量,离开作用于,release,引用计数1

此处不需要纠结,应该是跟编译器有关

我们重点放在 弱引用表结构 及存储逻辑上

拓展

image.png image.png

实现 _setWeaklyReferenced 方法的话,可以做自定义处理

上一篇下一篇

猜你喜欢

热点阅读