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; }
CCObject* CCObject::autorelease(void) { CCPoolManager::sharedPoolManager()->addObject(this); return this; }
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. }
的对象引用计数减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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |