博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx CCObject引用计数,内存释放分析(1)
阅读量:4214 次
发布时间:2019-05-26

本文共 1720 字,大约阅读时间需要 5 分钟。

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;    }}

转载地址:http://ktsmi.baihongyu.com/

你可能感兴趣的文章
Allowing Other Apps to Start Your Activity
查看>>
dev/mem
查看>>
pfn_valid 源码分析
查看>>
dev/kmem 和dev/mem的区别
查看>>
test-definitions/blob/master/auto-test/bazel/bazel.sh
查看>>
test-definitions/blob/master/auto-test/bigdata/bigdata.sh
查看>>
/test-definitions/blob/master/auto-test/blktrace/blktrace.sh
查看>>
test-definitions/blob/master/auto-test/blogbench/blogbench.sh
查看>>
test-definitions/blob/master/auto-test/boost/boost.sh
查看>>
Java多态性理解
查看>>
Intellij Idea 工具在java文件中怎么避免 import .*包,以及import包顺序的问题
查看>>
IDEA Properties中文unicode转码问题
查看>>
Oracle中Blob转换成Clob
查看>>
Linux如何查看so中函数名
查看>>
自动管理代码的android.mk
查看>>
cocos2dx 2.2.6编译记录(1)
查看>>
makefile学习网站
查看>>
C 编写lua模块(1)
查看>>
Lua教程:Lua调用C/C++函数(4)
查看>>
win下创建win32控制台工程,执行lua脚本
查看>>