__weak简析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__weak简析相关的知识,希望对你有一定的参考价值。

参考技术A

弱引用在oc中被经常用到的,用__weak修饰的对象不会引用计数+1,不会被强引用。
那么__weak是怎么做到的呢,苹果在底层对__weak做了啥? now show code:

看源码发现,__weak调用了objc_initWeak这个方法,然后在函数体内又调用了storeWeak 这个函数,那么storeWeak是啥样的呢?

这里重点看一下第58行到76行的2个函数:weak_unregister_no_lock、weak_register_no_lock。

weak_unregister_no_lock:如果当前的引用referrer_id有引用过其他对象,则会把之前的引用关系在weak_table中删除。

由此可见,__weak在底层只是做了一次weak_table表存储引用关系而已,并没有其他操作。(没有retian、没有引用计数器+1)
当对象执行dealloc方法的时候,在delloc方法中会去把当前对象的weak_table中的weak_entry_t清除掉,并把引用对象置为nil。流程图如下:

__attribute__((weak)):弱引用,可以不实现

参考技术A // 变量加上weak时,是弱符号。函数加上weak时,是弱引用,可以不实现。
// 给函数加上weak属性时,即使函数没定义,函数被调用也可以编译成功。
//当有两个函数同名时,则使用强符号(也叫全局符号,即没有加weak的函数)来代替弱符号(加weak的函数)。

int func() __weak;

int main()

func();

以上是关于__weak简析的主要内容,如果未能解决你的问题,请参考以下文章

__attribute__((weak)):弱引用,可以不实现

区别assign VS weak,__block VS __weak

__weak 修饰符

(iOS) __block和__weak认识

STM32的hal库中__weak函数前缀的作用

iOS开发-多层嵌套block中如何使用__weak和__strong