Cocos2dx 内存管理机制(2)
上上面我们可以知道 : create=new+autorelease
那么autorelease是什么呢,我们接着跟踪进入autorelease方法:
CCObject* CCObject::autorelease(void) { CCPoolManager::sharedPoolManager()->addObject(this); return this; }进入其中的addObject方法
void CCPoolManager::addObject(CCObject* pObject) { getCurReleasePool()->addObject(pObject); }再进入addObject方法
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. }然后我们可以发现俩个类:
CCPoolManager
对象自动管理类,这个类顾名思义就知道是对对象自动释放池进行管理的类,它是一个单例类,这里用来返回CCAutoreleasePool
CCAutoreleasePool
对象自动管理(释放)池。
从上面我们可以看到这样一句,将object添加到m_pManagedObjectArray 数组
m_pManagedObjectArray->addObject(pObject);
我们来看一下CCAutoreleasePool 这个类
class CC_DLL CCAutoreleasePool : public CCObject { CCArray* m_pManagedObjectArray; public: CCAutoreleasePool(void); ~CCAutoreleasePool(void); void addObject(CCObject *pObject); void removeObject(CCObject *pObject); void clear(); };
值得注意的是,这个类也是继承自CCObject,那么显然其内存管理形式也采用引用计数的。
再来回顾一下前面这个addObject方法
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. }
然后对对象进行release,也即对对象的引用计数进行减1的操作,至于为什么要释放,这里解释下:
①首先一个CCSprite对象被创建,使用的是new,那么其引用计数 m_uReference=1。这个应该不难理解吧:CCSprite是继承自CCObject,而在前面CCObject的构造方法中就知道,new创建一个实例对象后,其引用计数m_uReference=1,而是否自动管理变量 m_uAutoReleaseCount=0(表示对象未添加到自动管理(释放)池中自动管理)。
②接着对象autorelease,那么就是将对象添加到自动释放池中,而其中的:
m_pManagedObjectArray->addObject(pObject); 将被管理对象添加到自动管理池中的过程中(将对象添加到数组中),其会对对象进行retain操作的,所以 m_uReference 就变成了 m_uReference=2。
相关新闻>>
- 发表评论
-
- 最新评论 更多>>