Cocos2dx 内存管理机制(2)

来源:未知 责任编辑:责任编辑 发表时间:2014-03-23 22:25 点击:

上上面我们可以知道 : 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,那么显然其内存管理形式也采用引用计数的。

这时看到类中的 m_pManagedObjectArray 数组,我们将对象autorelease后,都是将对象添加到这个数组中的,所以说是对象自动管理(释放)池。



再来回顾一下前面这个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.
}


首先是将对象添加到数组中,然后将对象自动管理变量++,那么对象的 m_uAutoReleaseCount =1,也就是表明其为自动管理对象。


然后对对象进行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学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1