文章目录

  • 1.弱引用管理
  • 2.添加weak变量:一个弱引用指针的变量是怎样被添加到弱引用表中的
  • 3.源代码:objc-runtime-680版本
  • 3.1 objc_initWeak()
  • 3.2 storeWeak()
  • 3.3 weak_register_no_lock()
  • 通过原对象查找弱引用表的过程涉及到hash算法;添加弱引用变量,可以通过弱引用对象进行hash算法的计算,查找他对应的位置
  • 一个weak变量是怎样被添加到弱引用表中的?
  • 当一个对象被释放(废弃)后,weak变量是怎样处理的:清除weak变量,同时设置指向为nil

问:一个weak变量是怎样被添加到弱引用表中的?

1.弱引用管理

  • &obj1: 弱引用变量的地址
  • obj: 被修饰的对象

2.添加weak变量:一个弱引用指针的变量是怎样被添加到弱引用表中的

android 弱引用可能导致的问题 ios弱引用_弱引用

3.源代码:objc-runtime-680版本

luckyPerri/objc-runtime - github

3.1 objc_initWeak()

  • *location: 弱引用变量
  • newObj: 被弱引用的对象
  • android 弱引用可能导致的问题 ios弱引用_android 弱引用可能导致的问题_02


3.2 storeWeak()

android 弱引用可能导致的问题 ios弱引用_引用变量_03


android 弱引用可能导致的问题 ios弱引用_数组_04


android 弱引用可能导致的问题 ios弱引用_数组_05

3.3 weak_register_no_lock()

android 弱引用可能导致的问题 ios弱引用_弱引用_06


android 弱引用可能导致的问题 ios弱引用_android 弱引用可能导致的问题_07

  • referent: 原对象
  • weak_table: 弱引用表
  • weak_entry_for_referent: 通过原对象指针在弱引用表中查找他对应的弱引用数组
  • android 弱引用可能导致的问题 ios弱引用_弱引用_08


  • 后面的while循环是一个hash冲突的算法
  • android 弱引用可能导致的问题 ios弱引用_弱引用_09


通过原对象查找弱引用表的过程涉及到hash算法;添加弱引用变量,可以通过弱引用对象进行hash算法的计算,查找他对应的位置

  • append_referrer(entry, referrer): 将弱引用表添加到数组中
  • android 弱引用可能导致的问题 ios弱引用_数组_10


  • android 弱引用可能导致的问题 ios弱引用_数组_11


android 弱引用可能导致的问题 ios弱引用_引用变量_12

一个weak变量是怎样被添加到弱引用表中的?

一个被定义为__weak的对象指针,经过编译器的编译后会调用相应的objc_initWeak()方法,然后经过一系列的函数调用栈,最终在weak_register_no_lock()函数中,进行弱引用变量的添加,具体添加的位置时通过一个hash算法来进行位置查找的,如果查找位置中已经有了我们当前对象所对应的弱引用数组,我们就把新的弱引用变量,添加到该数组中;如果没有,我们重新创建一个弱引用数组,然后我们把第0个位置添加上我们最新的weak指针,后面的位置都初始化为nil

当一个对象被释放(废弃)后,weak变量是怎样处理的:清除weak变量,同时设置指向为nil

当一个对象被dealloc后,在dealloc的内部实现中,会去调用弱引用清除的相关函数,这个函数的内部实现中,会根据当前对象指针,hash查找弱引用表,把当前对象相对应的弱引用都拿出来(是一个数组),然后遍历这个数组中的所有弱引用指针,分别置为nil

android 弱引用可能导致的问题 ios弱引用_引用变量_13

android 弱引用可能导致的问题 ios弱引用_数组_14

android 弱引用可能导致的问题 ios弱引用_引用变量_15


android 弱引用可能导致的问题 ios弱引用_android 弱引用可能导致的问题_16


android 弱引用可能导致的问题 ios弱引用_数组_17