现在的位置: 首页 > 综合 > 正文

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

2014年09月05日 ⁄ 综合 ⁄ 共 1563字 ⁄ 字号 评论关闭

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

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,0, 99); 注意不addChild

  … …//省略代码

  returntrue;

}

voidHelloWorld::menuCloseCallback(CCObject* pSender)

{

          CCLOG("getPosition begin");

          CCPoint point =pSprite->getPosition();

          CCLOG("getPosition end");

… … //省略代码

}

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

3分析原因:

1)    加上这一句再做实验,程序正常,this->addChild(pSprite, 0, 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入门初级教程

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

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

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

结论:

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

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

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

抱歉!评论已关闭.