diff --git a/cocos2dx/cocoa/CCAutoreleasePool.cpp b/cocos2dx/cocoa/CCAutoreleasePool.cpp index d6583c296f..791226942a 100644 --- a/cocos2dx/cocoa/CCAutoreleasePool.cpp +++ b/cocos2dx/cocoa/CCAutoreleasePool.cpp @@ -41,18 +41,19 @@ CCAutoreleasePool::~CCAutoreleasePool(void) void CCAutoreleasePool::addObject(CCObject* pObject) { - CCAssert(false == pObject->m_bManaged, "this object is already in autorelese pool"); - 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. } void CCAutoreleasePool::removeObject(CCObject* pObject) { - m_pManagedObjectArray->removeObject(pObject, false); + for (int i = 0; i < pObject->m_uAutoReleaseCount; ++i) + { + m_pManagedObjectArray->removeObject(pObject, false); + } } void CCAutoreleasePool::clear() @@ -70,7 +71,7 @@ void CCAutoreleasePool::clear() if(!pObj) break; - pObj->m_bManaged = false; + --(pObj->m_uAutoReleaseCount); //(*it)->release(); //delete (*it); #ifdef _DEBUG diff --git a/cocos2dx/cocoa/CCObject.cpp b/cocos2dx/cocoa/CCObject.cpp index 8084c65180..ff8f6a5eba 100644 --- a/cocos2dx/cocoa/CCObject.cpp +++ b/cocos2dx/cocoa/CCObject.cpp @@ -38,7 +38,7 @@ CCObject* CCCopying::copyWithZone(CCZone *pZone) } CCObject::CCObject(void) -:m_bManaged(false) +:m_uAutoReleaseCount(0) ,m_uReference(1) // when the object is created, the reference count of it is 1 ,m_nLuaID(0) { @@ -51,7 +51,7 @@ CCObject::~CCObject(void) { // if the object is managed, we should remove it // from pool manager - if (m_bManaged) + if (m_uAutoReleaseCount > 0) { CCPoolManager::sharedPoolManager()->removeObject(this); } @@ -97,8 +97,6 @@ void CCObject::retain(void) CCObject* CCObject::autorelease(void) { CCPoolManager::sharedPoolManager()->addObject(this); - - m_bManaged = true; return this; } diff --git a/cocos2dx/cocoa/CCObject.h b/cocos2dx/cocoa/CCObject.h index 2aff081ee1..010e55df62 100644 --- a/cocos2dx/cocoa/CCObject.h +++ b/cocos2dx/cocoa/CCObject.h @@ -55,8 +55,8 @@ public: protected: // count of references unsigned int m_uReference; - // is the object autoreleased - bool m_bManaged; + // count of autorelease + unsigned int m_uAutoReleaseCount; public: CCObject(void); virtual ~CCObject(void);