对象回收时Weak指针自动被置为nil的实现原理
来源:互联网 发布:淘宝精品推荐分类 编辑:程序博客网 时间:2024/05/30 02:24
我们都知道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表中删除。 0 0
- 对象回收时Weak指针自动被置为nil的实现原理
- 对象回收时Weak指针自动被置为nil的实现原理
- weak 如何将对象置为nil
- runtime如何实现weak变量的自动置nil?
- __weak如何实现对象值自动设置为nil的
- __weak如何实现对象值自动设置为nil的
- strong修饰符实现weak效果(对象释放时,属性置nil)
- weak引用在什么时候被置为nil
- weak 属性需要在dealloc中置为nil吗
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- weak 的内部实现原理
- Cocos2D场景中对象引用为nil时的判断
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析)
- [Java] 监控java对象回收的原理与实现
- 监控Java对象回收的原理与实现
- [数据结构与算法]二叉树查找结点和最大最小值
- oracle恢复数据库
- XSS攻击与防御
- 获取客户端真实的ip
- Struts2获取表单数据的方式
- 对象回收时Weak指针自动被置为nil的实现原理
- 第九届移动互联网开发者大会( MDCon 2016 )早鸟票分享
- 实例解析MySQL性能瓶颈排查定位
- 表单提交后台正则表达式验证
- intellIJ idea 配置 svn
- 互联网程序员必备知识链接
- ZXing框架介绍
- 详解nginx+spawn-fcgi+demo+fcgi库函数
- 影响lucence 打分的因素