开发者社区> 问答> 正文

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

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

展开
收起
a123456678 2016-07-20 15:47:30 2163 0
1 条回答
写回答
取消 提交回答
  • 从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);
    }
    2019-07-17 19:58:59
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载