加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x之retain与release

发布时间:2020-12-14 16:24:44 所属栏目:百科 来源:网络整理
导读:先上代码: void Ref::retain(){ CCASSERT(_referenceCount 0,"reference count should be greater than 0"); ++_referenceCount;} void Ref::release(){ CCASSERT(_referenceCount 0,"reference count should be greater than 0"); --_referenceCount; if (

先上代码:

void Ref::retain()
{
    CCASSERT(_referenceCount > 0,"reference count should be greater than 0");
    ++_referenceCount;
}

void Ref::release()
{
    CCASSERT(_referenceCount > 0,"reference count should be greater than 0");
    --_referenceCount;

    if (_referenceCount == 0)
    {
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
        auto poolManager = PoolManager::getInstance();
        if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this))
        {
            
            CCASSERT(false,"The reference shouldn't be 0 because it is still in autorelease pool.");
        }
#endif

#if CC_REF_LEAK_DETECTION
        untrackRef(this);
#endif
        delete this;
    }
}

前者的作用是。。。。额,就一句话++_referenceCount;。那么到底有啥用呢?先看Sprite::create()的代码
Sprite* Sprite::create(const std::string& filename)
{
    Sprite *sprite = new (std::nothrow) Sprite();
    if (sprite && sprite->initWithFile(filename))
    {
        sprite->autorelease();
        return sprite;
    }
    CC_SAFE_DELETE(sprite);
    return nullptr;
}

一,autorelease的作用

看过cocos2d-x的内存管理机制的朋友都知道 (没看过???来来来~~~http://www.52php.cn/article/p-pkeqdyzk-k.html)

被继承自Ref的类创建的对象会被加入cocos2d-x的内存管理机制,这样这个对象在游戏中的每一帧都会被autorelease给监视着,如果这个对象没人认领,即引用计数为0,则 将其杀掉


二,那么retain的作用便是

认领这个对象。这样这个对象就不会autorelease给杀掉


三,release的作用是

这个对象实在是没用了,我主动把你杀掉了(那能不能仁慈点,不杀呢?。。。。 不杀你给我内存啊,这样会造成内存泄露)


四,具体什么时候用retain

通常我们没用retain的时候不是也是好好的吗,没错,但是那是因为之后他被addChild的了,这样这个对象就被当做孩子认领了,自然不会再受到autorelease的威胁


所以,当这个对象是个成员对象时,即被添加了内存管理机制,同时有没addChild时,我们要对其retain。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读