本文主要是介绍12.05-dealloc weak表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1. -dealloc
- 1. _objc_rootDealloc
- 2. rootDealloc
- 3. object_dispose
- 在这里插入图片描述
- 4. objc_destructInstance
- 5. clearDeallocating()
- 6. clearDeallocating_slow
- 1. 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_t
- weak_table_t 里就存着 a,b,c 这三个对象的地址, 把这三个对象的值都置为nil
这篇关于12.05-dealloc weak表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!