关于弱引用在工作和面试中都会经常遇到,那么这里我就两个问题说一下弱引用管理。
weak变量是怎样添加到弱引用表中的?
当使用如下代码
id __weak obj1 = obj;
经过编译之后会变成:
id obj1;
objc_initWeak(&obj1,obj);
一个被声明为__weak
的对象指针,经过编译器的编译之后,会调用objc_initWeak()
方法,经过一系列的函数调用栈,最终会在weak_register_no_lock()
函数中进行弱引用变量的添加,具体添加的位置是通过Hash算法
来进行位置查找的,如果查找过程中已经有了当前对象对应的弱引用数组,就把这个新的弱引用变量添加到这个数组中,如果没有的话,就重新创建一个弱引用数组,把这个新的弱引用变量添加到第0个位置,后面的都置为nil。 其中具体的实现过程可以在苹果官网查看相应的源码实现。
清除weak变量,同时设置置为nil
当一个weak 对象被dealloc之后,dealloc内部会去调用弱引用清除的相关函数,然后调用weak_clear_no-lock()
函数,根据当前指针查找弱引用表,找到当前对象相对应的弱引用数组,遍历这个数组的所有弱引用指针,分别置为nil.
网友评论