- 本帖最后由 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保持一致