美文网首页
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的实现原理

    weak & assign weak修饰对象赋值方式:复制引用对象销毁后自动置为nill assign修饰基本数据...

  • 2020-09-28 技术回顾

    weak的实现原理 Runtime 维护了一个 weak表,用于存储指向某个对象的所有weak指针。weak表 其...

  • dailyLearning -- 关键字weak实现原理

    weak 实现原理的概括 Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其...

  • #2-weak 实现原理

    weak 实现原理的概括 Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其...

  • iOS-weak

    weak实现原理: Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。 weak表其实是...

  • Weak

    weak实现原理: Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一...

  • 浅谈weak属性的理解

    weak实现原理: Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一...

  • weak的实现原理及weak属性如何自动置nil的?

    weak的实现原理:runtime维护着一个weak表即hash表,用于存储指向对象的weak指针Weak表是Ha...

  • weak理解

    创建weak对象obj1 weak 实现原理的概括 runtime维护一个weak表,用来存储某个对象的所有wea...

  • iOS 中weak的实现原理和销毁

    A.weak的实现原理? 初始化时:runtime 会调用objc_initWeak函数,初始化一个新的weak指...

网友评论

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

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