这两天在研究oc中的weak实现原理,只是看明白了一点浅显的东西,参考地址:
https://www.jianshu.com/p/2c2da28a5a53
以下是自己的理解:
基本用法:
-
声明属性的时候,可以用
weak
来修饰。这样我们的指针只是对某个对象拥有了使用权,但是没有所有权;一个对象多一个weak
指针,它的引用计数并未增加;当对象释放的时候,指向它的weak
指针会自动置为nil
,因此weak
指针使用非常安全。 -
__weak
修饰一个变量,可以起到解除循环引用的目的
如果是面试,面试官肯定会要深入的问,为什么对象释放的时候,指针会自动置为nil
,如何实现的?
系统维护了一个全局的map表。这个表里有多个sideTable
,sideTable里面有weak_table
(弱引用表)
当通过__weak
让一个指针指向一个对象的时候,如果这个对象之前没有被注册,就会调用objc_initWeak()
方法
如果是已经注册的,会调用objc_storeWeak()
。对象销毁的时候,会调用objc_destroyWeak()
当然,objc_initWeak()
和objc_destroyWeak()
最终都会调用objc_storeWeak()
。
objc_storeWeak()
这个方法里,先根据对象的地址,从全局map表中找到对应的sideTable
,然后再从sideTable
中找到对应的weak_table
,找到弱引用表后,生成或者更新weak_entry_t
。weak_entry_t
里面存了对象的地址和指向对象的所有弱引用指针。
对象销毁的时候,是找到对应的weak_entry_t
,把里面的指针都移除掉
网友评论