欢迎转载:http://blog.csdn.net/fylz1125/article/details/8519887
上一篇文章写了引用计数和自动释放的大概流程,其中略过了自动释放池,这里简单述说。
前面提到CCObject的autorelease函数
- CCObject*CCObject::autorelease(void)
- {
- CCPoolManager::sharedPoolManager()->addObject(this);
- returnthis;
- }
这里的sharedPoolManager()函数表明CCPoolManager是个单例类。
题外话:cocos2d-x里面大量的用到了单例模式,每个单例类都有个明显的标志,就是它的实例获取函数,从命名规则上看都是sharedxxx()形式。
跟进这个addObject函数
voidCCPoolManager::addObject(CCObject*pObject)
- getCurReleasePool()->addObject(pObject);
- }
这里就到了CCPoolManager,来看下这个类
classCC_DLLCCPoolManager
- CCArray*m_pReleasePoolStack;
- CCAutoreleasePool*m_pCurReleasePool;
-
- CCAutoreleasePool*getCurReleasePool();
- public:
- CCPoolManager();
- ~CCPoolManager();
- voidfinalize();
- voidpush();
- voidpop();
- voidremoveObject(CCObject*pObject);
- voidaddObject(CCObject*pObject);
-
- staticCCPoolManager*sharedPoolManager();
- staticvoidpurgePoolManager();
- friendclassCCAutoreleasePool;
- };
这里可以看到它维护一个自动释放池CCAutoreleasePool,还有个CCArray变量,是个栈结构,来管理自动释放池。
看下实现:
#include"CCAutoreleasePool.h"
- #include"ccMacros.h"
- NS_CC_BEGIN
-
- staticCCPoolManager*s_pPoolManager=NULL;
- CCAutoreleasePool::CCAutoreleasePool(void)
- {
- m_pManagedObjectArray=newCCArray();
- m_pManagedObjectArray->init();
- }
- CCAutoreleasePool::~CCAutoreleasePool(void)
- CC_SAFE_DELETE(m_pManagedObjectArray);
- }
- voidCCAutoreleasePool::addObject(CCObject*pObject)
- m_pManagedObjectArray->addObject(pObject);
- CCAssert(pObject->m_uReference>1,"referencecountshouldbegreaterthan1");
- ++(pObject->m_uAutoReleaseCount);
- pObject->release();
- voidCCAutoreleasePool::removeObject(CCObject*pObject)
- for(unsignedinti=0;i<pObject->m_uAutoReleaseCount;++i)
- m_pManagedObjectArray->removeObject(pObject,false);
- voidCCAutoreleasePool::clear()
- if(m_pManagedObjectArray->count()>0)
-
- #ifdef_DEBUG
- intnIndex=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();
- //--------------------------------------------------------------------
- //
- //CCPoolManager
- CCPoolManager*CCPoolManager::sharedPoolManager()
- if(s_pPoolManager==NULL)
- s_pPoolManager=newCCPoolManager();
- returns_pPoolManager;
- voidCCPoolManager::purgePoolManager()
- CC_SAFE_DELETE(s_pPoolManager);
- CCPoolManager::CCPoolManager()
- m_pReleasePoolStack=newCCArray();
- m_pReleasePoolStack->init();
- m_pCurReleasePool=0;
- CCPoolManager::~CCPoolManager()
- finalize();
- //weonlyreleasethelastautoreleasepoolhere
- m_pCurReleasePool=0;
- m_pReleasePoolStack->removeObjectAtIndex(0);
- CC_SAFE_DELETE(m_pReleasePoolStack);
- voidCCPoolManager::finalize()
- if(m_pReleasePoolStack->count()>0)
- //CCAutoreleasePool*pReleasePool;
- CCObject*pObj=NULL;
- CCARRAY_FOREACH(m_pReleasePoolStack,pObj)
- if(!pObj)
- break;
- CCAutoreleasePool*pPool=(CCAutoreleasePool*)pObj;
- pPool->clear();
- voidCCPoolManager::push()
- CCAutoreleasePool*pPool=newCCAutoreleasePool();
- m_pCurReleasePool=pPool;
- m_pReleasePoolStack->addObject(pPool);
- pPool->release();
- voidCCPoolManager::pop()
- if(!m_pCurReleasePool)
- return;
- intnCount=m_pReleasePoolStack->count();
- m_pCurReleasePool->clear();
- if(nCount>1)
- m_pReleasePoolStack->removeObjectAtIndex(nCount-1);
- //if(nCount>1)
- //{
- //m_pCurReleasePool=m_pReleasePoolStack->objectAtIndex(nCount-2);
- //return;
- //}
- m_pCurReleasePool=(CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(nCount-2);
- /*m_pCurReleasePool=NULL;*/
- voidCCPoolManager::removeObject(CCObject*pObject)
- CCAssert(m_pCurReleasePool,"currentautoreleasepoolshouldnotbenull");
- m_pCurReleasePool->removeObject(pObject);
- voidCCPoolManager::addObject(CCObject*pObject)
- getCurReleasePool()->addObject(pObject);
- CCAutoreleasePool*CCPoolManager::getCurReleasePool()
- if(!m_pCurReleasePool)
- push();
- returnm_pCurReleasePool;
- NS_CC_END
好了,就这些。
一个对象添加到自动释放池后在什么时机被释放,这里不写了。后面有机会再写。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|