内存管理机制的基本概念及应用
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内存管理机制。