12.05-dealloc & weak表

12.05-dealloc & weak表,第1张

文章目录 1. -dealloc1. _objc_rootDealloc2. rootDealloc3. object_dispose 在这里插入图片描述4. objc_destructInstance5. clearDeallocating()6. clearDeallocating_slow1. weak 表1. weak_clear_no_lock


引用计数可以直接存储在优化过的isa指针中,当引用过多,就会存储在Side Table中

refcnts : 存放着引用计数的散列表


1. -dealloc dealloc 方法中会调用_objc_rootDealloc

引用计数为0


1. _objc_rootDealloc

执行rootDealloc()


2. rootDealloc

如果被弱引用过,有过关联属性等,就执行object_dispose


3. object_dispose 4. objc_destructInstance


5. clearDeallocating()


6. clearDeallocating_slow

从SideTables 这个总表中获取一张 SideTable类型的表 table
表table中删除引用计数 和 weak


1. weak 表 1. weak_clear_no_lock


有a,b,c 三个对象弱引用了obj1,当obj1被释放了在SideTables这个表中,以obj1的地址哈希后的值为key,找到一张SideTable这个SideTable有一个自旋锁,当对着个表进行 *** 作的时候,就会加锁

为什么会有多张SideTable,而不是一张?
从这个自旋锁可以推断出,如果只有一张表,那么如果同时有很多对象释放时,这个锁的作用,就相当于是单线程,一次只能释放一个对象.
那如果是多张表,那么很多对象释放的时候,多张表,多个锁,可以同时释放多个对象.

在SideTable这个表中,以obj1的地址哈希后的值为key,找到weak_table_tweak_table_t 里就存着 a,b,c 这三个对象的地址, 把这三个对象的值都置为nil

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/994396.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存