__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)):弱引用,可以不实现