Objective-C RunTime

【转载】对象回收时Weak指针自动被置为nil的实现原理

2017-03-20  本文已影响26人  小白猿

前言

文章系转载,原文路径

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

内部实现 —— Weak表

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--;
    }
}
上一篇下一篇

猜你喜欢

热点阅读