文章目录
- 1.弱引用管理
- 2.添加weak变量:一个弱引用指针的变量是怎样被添加到弱引用表中的
- 3.源代码:objc-runtime-680版本
- 3.1 objc_initWeak()
- 3.2 storeWeak()
- 3.3 weak_register_no_lock()
- 通过原对象查找弱引用表的过程涉及到hash算法;添加弱引用变量,可以通过弱引用对象进行hash算法的计算,查找他对应的位置
- 一个weak变量是怎样被添加到弱引用表中的?
- 当一个对象被释放(废弃)后,weak变量是怎样处理的:清除weak变量,同时设置指向为nil
问:一个weak变量是怎样被添加到弱引用表中的?
1.弱引用管理
- &obj1: 弱引用变量的地址
- obj: 被修饰的对象
2.添加weak变量:一个弱引用指针的变量是怎样被添加到弱引用表中的
3.源代码:objc-runtime-680版本luckyPerri/objc-runtime - github
3.1 objc_initWeak()
- *location: 弱引用变量
- newObj: 被弱引用的对象
3.2 storeWeak()
3.3 weak_register_no_lock()
- referent: 原对象
- weak_table: 弱引用表
- weak_entry_for_referent: 通过原对象指针在弱引用表中查找他对应的弱引用数组
- 后面的while循环是一个hash冲突的算法
通过原对象查找弱引用表的过程涉及到hash算法;添加弱引用变量,可以通过弱引用对象进行hash算法的计算,查找他对应的位置
- append_referrer(entry, referrer): 将弱引用表添加到数组中
一个被定义为__weak的对象指针,经过编译器的编译后会调用相应的objc_initWeak()方法,然后经过一系列的函数调用栈,最终在weak_register_no_lock()函数中,进行弱引用变量的添加,具体添加的位置时通过一个hash算法来进行位置查找的,如果查找位置中已经有了我们当前对象所对应的弱引用数组,我们就把新的弱引用变量,添加到该数组中;如果没有,我们重新创建一个弱引用数组,然后我们把第0个位置添加上我们最新的weak指针,后面的位置都初始化为nil
当一个对象被释放(废弃)后,weak变量是怎样处理的:清除weak变量,同时设置指向为nil当一个对象被dealloc后,在dealloc的内部实现中,会去调用弱引用清除的相关函数,这个函数的内部实现中,会根据当前对象指针,hash查找弱引用表,把当前对象相对应的弱引用都拿出来(是一个数组),然后遍历这个数组中的所有弱引用指针,分别置为nil