ios - 关于OC中的内存管理:release 方法先判断释放条件还是将count 减一?
伊谢尔伦
伊谢尔伦 2017-04-17 11:43:21
[iOS讨论组]

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

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
高洛峰

从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判断的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号