cocos2d-x 内存管理(3)

来源:互联网 发布:洛阳平安数据招聘信息 编辑:程序博客网 时间:2024/06/08 21:03

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

0 0