美文网首页
Runtime运行时四:weak的实现原理

Runtime运行时四:weak的实现原理

作者: Carson_Zhu | 来源:发表于2018-02-05 18:42 被阅读14次

    weak & assign

    • weak
      修饰对象
      赋值方式:复制引用
      对象销毁后自动置为nill
    • assign
      修饰基本数据类型(也可以修饰对象)
      赋值方式:赋值值
      对象销毁后不会自动置为nill,形成野指针

    runtime是如何实现 weak 变量的自动置nil

    • runtime对注册的类会进行布局,对于weak修饰的对象会放入一个hash表中。
    • weak 指向的对象内存地址作为 key,对象作为value
    • 当此对象的引用计数为0的时候会 dealloc,假如weak指向的对象内存地址是a,那么就会以a为键在这个hash表中搜索,找到所有以a为键的weak对象,从而设置为nil

    具体机制

    objc_storeWeak(&weakPo, Model)函数:

    可以把objc_storeWeak(&weakPo, Model)理解为:objc_storeWeak(value, key),并且当key变nil,将value置nil。

    • objc_storeWeak函数把赋值对象(Model)的内存地址作为键值key,将weak修饰的属性变量(weakPo)的内存地址(& weakPo)作为value,注册到 weak 表中。
    • 如果Model为0(nil),那么把变量(weakPo)的内存地址(& weakPo)从weak表中删除。
    • 在Model非nil时,weakPo和Model指向同一个内存地址,在Model变nil时,weakPo变nil。此时向weakPo发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。

    相关文章

      网友评论

          本文标题:Runtime运行时四:weak的实现原理

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