cocos2d-x之retain与release

先上代码

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.jb51.cc/article/p-pkeqdyzk-k.html

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


二,那么retain的作用便是

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


三,release的作用是

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


四,具体什么时候用retain

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


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

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...