iOS中弱引用管理相关问题

2018-10-31  本文已影响26人  没八阿哥的程序

关于弱引用在工作和面试中都会经常遇到,那么这里我就两个问题说一下弱引用管理。

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.

上一篇下一篇

猜你喜欢

热点阅读