【建议】发现继承UIWidget时的一个坑!

  • 本帖最后由 wcw 于 2013-9-17 21:06 编辑 *

我用的cocos2d-x_v2.1.5a。
以前继承ccsprite,new之后加了autorelease(),最近用了cocostudio,没注意cocostudio里面是不能加这句的
先看两种用法:CCSprite CCSprite::create()*
{

  • CCSprite pSprite = new CCSprite();
  • if (pSprite && pSprite->init())*
  • {*
  • pSprite->autorelease();*
  •    return pSprite;*
    
  • }*
  • CC_SAFE_DELETE(pSprite);*
  • return NULL;*
    }


UIImageView UIImageView::create()*
{

  • UIImageView* widget = new UIImageView();*
  • if (widget && widget->init())*
  • {*
  • //z这里没有autorease哦*
  •    return widget;*
    
  • }*
  • CC_SAFE_DELETE(widget);*
  • return NULL;*
    }

不能加的原因在于,最后释放的方式是不同的:
void CCNode::removeChild(CCNode child, bool cleanup)*
{

  • // explicit nil handling*

  • if (m_pChildren == NULL)*

  • {*

  •    return;*
    
  • }*

  • if ( m_pChildren->containsObject(child) )*

  • {*

  • this->detachChild(child,cleanup); //这里面只会delte一次*

  • }*
    }


*void UIWidget::removeChildMoveToTrash(UIWidget *child)**{
if (!child)
{
return;
}
if (m_children->containsObject(child))
{
m_children->removeObject(child);
//如果前面有加autorelease,这里面会直接delete child,但是下面还有child访问,于是这里全崩。。。

    child->structureChangedEvent();

    child->releaseResoures();
    child->m_pWidgetParent = NULL;
    delete child;
}

}*
所以,
结论是:用cocostudio是有“潜规则”的,在继承时,new之后千万不能理所当然的加一句autorelease()
也建议cocostudio的开发人员是否可以改善下UIWidget::removeChildMoveToTrash,跟cocos2dx保持一致