本文共 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/