oc中 关于weak的粗浅理解

2019-08-26  本文已影响0人  雨天多久就

这两天在研究oc中的weak实现原理,只是看明白了一点浅显的东西,参考地址:
https://www.jianshu.com/p/2c2da28a5a53

以下是自己的理解:

基本用法:

如果是面试,面试官肯定会要深入的问,为什么对象释放的时候,指针会自动置为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_tweak_entry_t里面存了对象的地址和指向对象的所有弱引用指针。

对象销毁的时候,是找到对应的weak_entry_t,把里面的指针都移除掉

上一篇下一篇

猜你喜欢

热点阅读