美文网首页
oc中 关于weak的粗浅理解

oc中 关于weak的粗浅理解

作者: 雨天多久就 | 来源:发表于2019-08-26 20:29 被阅读0次

    这两天在研究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_tweak_entry_t里面存了对象的地址和指向对象的所有弱引用指针。

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

    相关文章

      网友评论

          本文标题:oc中 关于weak的粗浅理解

          本文链接:https://www.haomeiwen.com/subject/gyzdectx.html