首页 > 关于OC中的内存管理:release 方法先判断释放条件还是将count 减一?

关于OC中的内存管理:release 方法先判断释放条件还是将count 减一?

release 方法主要用于 reference counting。 有一点不太确定:方法中先判断是否达到释放条件,如果没达到,然后 count 减一? 还是另一种相反的情况:先将 count减一,然后判断是否达到释放条件呢??


从NSObject的源代码来看,是先判断计数器是否达到释放条件,如果可以释放了,就调用dealloc,如果没到,就对计数器减2。但是,了解这个内部的实现细节有什么实际意义吗?也许下一个版本就改成另一种方式了。

- (oneway void)release
__attribute__((aligned(16)))
{
    // 检查计数器
    if (_objc_rootReleaseWasZero(self) == false) {
        // 不满足释放条件,就返回
        return;
    }
    // 否则,就执行释放操作
    [self dealloc];
}

bool
_objc_rootReleaseWasZero(id obj)
{
    assert(obj);
    assert(!UseGC);

    if (OBJC_IS_TAGGED_PTR(obj)) return false;

    SideTable *table = SideTable::tableForPointer(obj);

    bool do_dealloc = false;

    if (OSSpinLockTry(&table->slock)) {
        // 找到这个对象的计数器
        RefcountMap::iterator it = table->refcnts.find(DISGUISE(obj));
        if (it == table->refcnts.end()) {
            // 没找到计数器,返回可以释放
            do_dealloc = true;
            table->refcnts[DISGUISE(obj)] = 1;
        } else if (it->second == 0) {
            // 计数器为0,也返回可以释放
            do_dealloc = true;
            it->second = 1;
        } else {
            // 否则,对计数器减2(因为retain的时候是加2)
            it->second -= 2;
        }
        OSSpinLockUnlock(&table->slock);
        return do_dealloc;
    }
    return _objc_rootReleaseWasZero_slow(obj);
}

完整的源代码在这里:http://opensource.apple.com/source/objc4/objc4-532.2/runtime/NSObject.mm?txt


release方法里没有判断逻辑,是否达到释放条件也与release无关。

release只负责对rc减1,至于是n-1还是0-1,不管,如果是0-1,直接挂。

是否打到释放条件是一个release pool判断的

【热门文章】
【热门文章】