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

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的实现原理)