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

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

概述1、所有继承CCObject的类,在创建时,引用计数都为1;m_uAutoReleaseCount=0,此时,没有加入自动释放池。 所以直接通过new创建的对象是没有加入自动释放池的。 CCObject::CCObject(void): m_nLuaID(0), m_uReference(1) // when the object is created, the reference count 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;    }}
总结

以上是内存溢出为你收集整理的cocos2dx CCObject引用计数,内存释放分析(1)全部内容,希望文章能够帮你解决cocos2dx CCObject引用计数,内存释放分析(1)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存