博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象回收时Weak指针自动被置为nil的实现原理
阅读量:6837 次
发布时间:2019-06-26

本文共 1429 字,大约阅读时间需要 4 分钟。

hot3.png

前言

我们都知道Weak指针不会增加所引用对象的计数,并在引用对象被回收的时候自动被置为nil。通常用于解决循环引用问题。那么,自动被置为nil内部是如何实现的呢?

内部实现 —— Weak表

Runtime维护了一个Weak表,用于存储指向某个对象的所有Weak指针。Weak表其实是一个哈希表,Key是所指对象的地址,Value是Weak指针的地址(这个地址的值是所指对象的地址)的数组。

在对象被回收的时候,经过层层调用,会最终触发下面的方法将所有Weak指针的值设为nil。(具体定义在objc-weak.m中)

PRIVATE_EXTERN void arr_clear_deallocating(weak_table_t *weak_table, id referent) {    {        weak_entry_t *entry = weak_entry_for_referent(weak_table, referent);        if (entry == NULL) {            /// XXX shouldn't happen, but does with mismatched CF/objc            //printf("XXX no entry for clear deallocating %p\n", referent);            return;        }        // zero out references        for (int i = 0; i < entry->referrers.num_allocated; ++i) {            id *referrer = entry->referrers.refs[i].referrer;            if (referrer) {                if (*referrer == referent) {                    *referrer = nil;                }                else if (*referrer) {                    _objc_inform("__weak variable @ %p holds %p instead of %p\n", referrer, *referrer, referent);                }            }        }        weak_entry_remove_no_lock(weak_table, entry);        weak_table->num_weak_refs--;    }}

简单来说,这个方法首先根据对象地址获取所以Weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从Weak表中删除。

这里只简单说说对象回收时,Weak指针如何设为nil,至于Weak指针如何注册到Weak表中、如何维护可以参考objc-weak.m中的其它源码。从实现中可以看出,Weak指针的使用涉及到Hash表的增删改查,有一定的性能开销。

转载于:https://my.oschina.net/jlongtian/blog/862072

你可能感兴趣的文章
Express 搭建web服务器
查看>>
Github 的 Pull Request 教程
查看>>
SmartRules让MindManager的交互图变得更加智能
查看>>
如何使用React动态添加/删除class来改变样式
查看>>
mysql-连接查询
查看>>
Axure RP9 自学之路2-基础操作篇
查看>>
GMS(cts、gsi、vts、gts、ctsv)问题总结
查看>>
runtime 关联对象objc_setAssociatedObject
查看>>
比较某两个时间的时间戳相等
查看>>
外墙清洗这件事,到底怎样才算安全?
查看>>
java B2B2C Springcloud多租户电子商城系统-spring-cloud-eureka
查看>>
11月29日云栖精选夜读:阿里传奇工程师多隆的程序世界
查看>>
推荐一些学习软件编程的网站
查看>>
Throwable
查看>>
三栏布局 五中解决方式
查看>>
ES6手册
查看>>
Go学习之-用vscode写go代码遇到的问题
查看>>
Django搭建个人博客:渲染Markdown文章目录
查看>>
菜鸟成长之路05/06/07
查看>>
Android 动画之属性动画
查看>>