前言
我们都知道 Weak 指针不会增加所引用对象的计数,并在引用对象被回收的时候自动被置为 nil 。通常用于解决循环引用问题。那么,自动被置为 nil 是如何实现的呢?答案是 Weak 表。
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

本文探讨了Objective-C中Weak指针的工作原理,当引用对象被回收时,Weak指针如何自动被设置为nil。Weak指针通过Runtime的Weak表来存储和管理,对象回收时会触发相应机制将Weak指针清空,避免循环引用。同时,文中提醒使用Weak指针可能带来的性能开销问题。
1万+

被折叠的 条评论
为什么被折叠?



