bombing:cocos2d-x内存管理机制-侧重调用

内存管理机制的基本概念及应用

1、基础知识

cocos2dx采用的是引用计数的方式来管理对象的持有和释放。

所谓引用计数就是说,每个对象都会有一个属性用来记录当前被几个地方引用了。在释放内存的时候会根据这个引用计数来确定是否要用delete操作符来释放这个对象占用的内存。具体见CCObeject的默认构造函数,retain和release方法。

2实验:helloworld项目中

//创建一个精灵,制作一个关闭菜单,关闭菜单中去修改精灵位置

1)helloworld类.h中声明一个CCSprite *pSprite成员变量

2)helloworld类的

boolHelloWorld::init()

{

… … //省略代码

//创建一个精灵,

pSprite= CCSprite::create("CloseSelected.png");

pSprite->setPosition(ccp(200,200));

//this->addChild(pSprite,99); 注意不addChild

… …//省略代码

returntrue;

}

voidHelloWorld::menuCloseCallback(CCObject* pSender)

CCLOG("getPosition begin");

CCPoint point =pSprite->getPosition();

CCLOG("getPosition end");

}

单击关闭按钮,程序会coredump。

3分析原因:

1)加上这一句再做实验,程序正常,this->addChild(pSprite,99);

结论:

1)addChild函数认领了对象。让对象交给cocos2d-x内存管理机制去管理。

addchild函数里面调用了retain()方法,让对象引用次数+1;垃圾回收时,再-1,不会是零,所以精灵对象不会被delete。

4 内存管理机制的应用

应用层面结论:

1)Retain()函数:将引用计数加1;

2)Release()函数:将引用计数减1,如果引用计数为0,delete本对象。

autorelease()函数,将本对象加入内存管理池中,并将对象引用计数m_uReference为1,m_uAutoReleaseCount为1.


内存管理机制的深入理解

问题1:new一个从CCObject类继承的对象发生了什么?

结论:m_uReference=1;m_uAutoReleaseCount=0

问题2:手工创建object对象后,object析构函数做了什么?

测试:HelloWorld项目中,运行run1函数

结论:手工管理,手工释放

问题3:把对象执行autorelease函数,交给cocos2d-x内存管理机制,cocos2d-x做了什么?

分析如下:

备注:此图来自:Xucuiping 2013.6.13cocos2dx入门初级教程

问题4:精灵什么时候被删除

大家也参考《cocos2d-x高级开发教程》2.3.3节,书中介绍了CCPoolManager管理、CCAutoreleasePool的方法。篇幅原因,暂不赘述。

1)AddChild函数做了reatain操作保证了,保证精灵不会被垃圾器删除

2)我们创建了精灵对象、或者CCObject对象,如果进行了autorelease操作,如果没有把这个节点添加到父节点(形象比喻:没有认领的话,),若跨多帧保存精灵对象,需要执行retain操作。

3)对于精灵这样的节点对象,建议使用cocos2d-x内存管理机制。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...