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

cocos2dx CCObject引用计数,内存释放分析(1)

发布时间:2020-12-14 20:40:50 所属栏目:百科 来源:网络整理
导读:1、所有继承CCObject的类,在创建时,引用计数都为1;m_uAutoReleaseCount=0,此时,没有加入自动释放池。 所以直接通过new创建的对象是没有加入自动释放池的。 CCObject::CCObject(void): m_nLuaID(0),m_uReference(1) // when the object is created,the r
1、所有继承CCObject的类,在创建时,引用计数都为1;m_uAutoReleaseCount=0,此时,没有加入自动释放池。

所以直接通过new创建的对象是没有加入自动释放池的。

CCObject::CCObject(void)
: m_nLuaID(0),m_uReference(1) // when the object is created,the reference count of it is 1,m_uAutoReleaseCount(0)
{
    static unsigned int uObjectCount = 0;

    m_uID = ++uObjectCount;
}


2、加入自动释放池,需要手动调用autorelease函数,在cocos2dx中,通过create函数创建的对象,都调用了:
CCObject* CCObject::autorelease(void)
{
    CCPoolManager::sharedPoolManager()->addObject(this);
    return this;
}


调用下面的函数后,引用计数仍然是1(加1又减1),m_uAutoReleaseCount++

void CCAutoreleasePool::addObject(CCObject* pObject)
{
    m_pManagedObjectArray->addObject(pObject);

    CCAssert(pObject->m_uReference > 1,"reference count should be greater than 1");
    ++(pObject->m_uAutoReleaseCount);
    pObject->release(); // no ref count,in this case autorelease pool added.
}


3、 在每帧的结束的时候,会自动释放当前释放池中的对象,应该是把加入自动释放池中
的对象引用计数减1,如果引用计数为0,就释放:

void CCAutoreleasePool::clear()
{
    if(m_pManagedObjectArray->count() > 0)
    {
        //CCAutoreleasePool* pReleasePool;
#ifdef _DEBUG
        int nIndex = m_pManagedObjectArray->count() - 1;
#endif

        CCObject* pObj = NULL;
        CCARRAY_FOREACH_REVERSE(m_pManagedObjectArray,pObj)
        {
            if(!pObj)
                break;

            --(pObj->m_uAutoReleaseCount);
            //(*it)->release();
            //delete (*it);
#ifdef _DEBUG
            nIndex--;
#endif
        }

        m_pManagedObjectArray->removeAllObjects();
    }
}

4、
在m_pManagedObjectArray->removeAllObjects()(在CCArray中)调用CCObject::release函数,
把引用计数减1,为0时,则delete对象,释放整个对象。

void CCObject::release(void)
{
    CCAssert(m_uReference > 0,"reference count should greater than 0");
    --m_uReference;

    if (m_uReference == 0)
    {
        delete this;
    }
}

(编辑:李大同)

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

    推荐文章
      热点阅读