cocos2d-x 内存管理(3)~
前两篇博文转自:http://blog.csdn.net/whuancai/article/details/23347143, 这边博文有助于理解cocos2d-x的内存管理机制。
自己在TsetCpp工程时,对于其中的ActionsTest.cpp中如下代码段产生疑问,不明白为什么创建精灵对象后使用addChild()函数之前需要进行一次retain()?
voidActionsDemo::onEnter()
{
CCLayer::onEnter();
// Or you can create an sprite usinga filename. only PNG is supported now. Probably TIFF too
m_grossini =CCSprite::create(s_pPathGrossini);
m_grossini->retain();
m_tamara =CCSprite::create(s_pPathSister1);
m_tamara->retain();
m_kathia = CCSprite::create(s_pPathSister2);
m_kathia->retain();
addChild(m_grossini, 1);
addChild(m_tamara, 2);
addChild(m_kathia, 3);
m_grossini->setPosition(ccp(VisibleRect::center().x,VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height/3));
m_tamara->setPosition(ccp(VisibleRect::center().x,VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height*2/3));
m_kathia->setPosition(ccp(VisibleRect::center().x,VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height/2));
后面省略... ...
}
若将上述代码中的三个精灵创建后的调用retain()函数的代码注释掉,然后运行程序,程序顺利执行,但在点击下一个动
作时,程序出错,可是这是为什么呢?
先调试上面一段程序,
m_grossini =CCSprite::create(s_pPathGrossini);
m_grossini->retain();
addChild(m_grossini, 1);
执行完上面三条语句时,m_grossini的引用计数分别是1、2、3,create方法将m_grossini设置为autorelease,在渲染下一帧之前自动释放,为避免自动释放,需要把m_grossini的管理权交给ActionsDemo层,但是为什么又需要使用retain()函数呢?
在点击下一个动作的菜单项时,进入相应的onEnter()函数,其中首先需要调用父类 ActionsDemo的onEnter函数,调用完后,该层(ActionsDemo层)将会析构,层管理的精灵也会析构掉,如果不添加retain函数,无法进入掉下一个动作场景,因为相应的精灵已经被析构了。
voidActionMove::onEnter()
{
ActionsDemo::onEnter();
centerSprites(3);
CCSize s =CCDirector::sharedDirector()->getWinSize();
CCActionInterval* actionTo = CCMoveTo::create(2,ccp(s.width-40, s.height-40));
CCActionInterval* actionBy = CCMoveBy::create(2, ccp(80,80));
CCActionInterval* actionByBack = actionBy->reverse();
m_tamara->runAction( actionTo);
m_grossini->runAction(CCSequence::create(actionBy, actionByBack, NULL));
m_kathia->runAction(CCMoveTo::create(1,ccp(40,40)));
}
最后关于retain()和release()到底怎么玩,这篇博文写的不错~
http://cn.cocos2d-x.org/tutorial/show?id=163