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。
相关新闻>>
- 发表评论
-
- 最新评论 进入详细评论页>>

![cocos2d_x+lua[2]](/uploads/allimg/131030/110J64609-0-lp.jpg)








