问题: 简述一下weak的实现原理.


weak是弱引用,用weak来修饰对象其引用计数是不会增加了, weak常用来解决循环引用问题.

weak的实现原理是Runtime全局维护的一张weak表,其中key为objc_object的内存地址指针,value为weak指针的地址数组.

weak相关步骤如下所示.

  1. 初始化开始的时候, 会调用 objc_initWeak() 函数, 初始化新的weak指针指向对象的地址.

  2. objc_initWeak() 内部会调用 objc_storeWeak() 函数,objc_storeWeak()的作用是用来更新指针的指向,创建弱引用表.

  3. 当对象释放的时候,底层调用的是 rootDealloc() 函数, 如果没有C++的析构函数,没有关联对象,没有weak指针曾经指向过,那么就会通过 free 立马释放该对象. 对于weak,那么其实会进一步调用 clearDeallocating() 函数, clearDeallocating() 会根据对象的地址获取到其对应的weak指针列表, 遍历整个列表把它置为nil, 最后把这个 entry 从全局的weak表中删除.


IT界无底坑洞栋主 欢迎加Q骚扰:676758285