引用计数的存储

在64位中,引用计数可以直接存储在优化过的isa指针中,也可能存储在SideTable类中。

在这里插入图片描述

在isa里面,有一个extra_rc参数
其中:rc就是retainCount引用计数的意思。

则has_sidetable_rc=1,引用计数器会存储在一个名为SideTable的类的属性中。

struct SideTable 
{
    spinlock_t slock;// 保证原子操作的自旋锁
    RefcountMap refcnts;//引用计数器存储地,是一个哈希map表
    weak_table_t weak_table;//弱引用表,也是哈希map存储
}

在源码中,可以找到retainCount的源码:

- (NSUInteger)retainCount {
    return ((id)self)->rootRetainCount();
}

点击进去:

inline uintptr_t 
objc_object::rootRetainCount()
{
    if (isTaggedPointer()) return (uintptr_t)this;

    sidetable_lock();
    isa_t bits = __c11_atomic_load((_Atomic uintptr_t *)&isa.bits, __ATOMIC_RELAXED);
    if (bits.nonpointer) {
        uintptr_t rc = bits.extra_rc;
        if (bits.has_sidetable_rc) {
            rc += sidetable_getExtraRC_nolock();
        }
        sidetable_unlock();
        return rc;
    }

    sidetable_unlock();
    return sidetable_retainCount();
}

sidetable_getExtraRC_nolock();的实现源码

posted @ 2022-09-07 10:35  任淏  阅读(57)  评论(0编辑  收藏  举报