关于3.3正式版中pushScene和popScene的崩溃问题

最近在使用3.3,在连续pushScene和popScene的时候程序会异常崩溃,问题定位到Node的onExit处理子节点的位置,我增加了一个子节点数量的判断,但是还是会报异常,大家有遇到这种问题吗?怎么解决的?

请提供重现的测试例。

 
bool Scene1::init() 
{ 
bool bRet = false; 

do 
{ 
CC_BREAK_IF(!Layer::init()); 

Size visibleSize = Director::getInstance()->getWinSize(); 

Label* label_title = Label::createWithTTF("This is scene1", "fonts/Marker Felt.ttf", 30); 
label_title->setPosition(Vec2(visibleSize.width / 2, visibleSize.height * 0.8)); 
addChild(label_title); 

MenuItemLabel* item = MenuItemLabel::create(Label::createWithTTF("show scene2", "fonts/Marker Felt.ttf", 30), this, menu_selector(Scene1::menuCallback)); 
item->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); 

Menu* menu = Menu::create(item, NULL); 
menu->setAnchorPoint(Vec2::ZERO); 
menu->setPosition(Vec2::ZERO); 
addChild(menu); 

bRet = true; 
} while (0); 

return bRet; 
} 

Scene* Scene1::createScene() 
{ 
Scene* s = Scene::create(); 
s->addChild(Scene1::create()); 
return s; 
} 

void Scene1::menuCallback(Ref* sender) 
{ 
Director::getInstance()->pushScene(TransitionFade::create(1, Scene2::createScene())); 
} 

```
 

 

bool Scene2::init() 
{ 
bool bRet = false; 

do 
{ 
CC_BREAK_IF(!Layer::init()); 

Size visibleSize = Director::getInstance()->getWinSize(); 

Label* label_title = Label::createWithTTF("This is scene2", "fonts/Marker Felt.ttf", 30); 
label_title->setPosition(Vec2(visibleSize.width / 2, visibleSize.height * 0.8)); 
addChild(label_title); 

MenuItemLabel* item = MenuItemLabel::create(Label::createWithTTF("go back scene1", "fonts/Marker Felt.ttf", 30), this, menu_selector(Scene2::menuCallback)); 
item->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); 

Menu* menu = Menu::create(item, NULL); 
menu->setAnchorPoint(Vec2::ZERO); 
menu->setPosition(Vec2::ZERO); 
addChild(menu); 

bRet = true; 
} while (0); 

return bRet; 
} 

Scene* Scene2::createScene() 
{ 
Scene* s = Scene::create(); 
s->addChild(Scene2::create()); 
return s; 
} 

void Scene2::menuCallback(Ref* sender) 
{ 
Director::getInstance()->popScene(); 
} 


```
 

就是这样的两个场景,做类似的弹出窗口那种,两个场景来回切换2,3次,就会报异常。 

把 切换 动画

TransitionFade::create

先去掉 看看 是否还出现

请教一下,我也遇到过这个情况,我的不知道和楼主同不同,我的是切换动画加了有几率崩,请问一下是什么原因?

TransitionFade::create,切换动画去了也是一样,还是会报这个错误,而且是必现的

MenuItemLabel的bug。

先这么做:

bool MenuItemLabel::initWithLabel(Node* label, Ref* target, SEL_MenuHandler selector)
{
    _target = target;
//    CC_SAFE_RETAIN(_target);
    return initWithLabel(label, std::bind(selector,target, std::placeholders::_1) );
}

void MenuItem::onExit()
{
    Node::onExit();
    //CC_SAFE_RELEASE(_target);
}
```


我也不确定这样有没有其他影响。

提了个issue:https://github.com/cocos2d/cocos2d-x/issues/9690

你subscribe这个issue。

好的,我先这样试试,关注下这个的回复,谢谢

请问楼主你这个问题解决了么? 我也碰上这个问题,就是两个scene, scene1 push 2再pop 2再push 2 时报的这个错误 我的版本是3.3final

我也遇到同样问题,解决方法是:
把类似这句的MenuItemLabel* item = MenuItemLabel::create(Label::createWithTTF(“show scene2”, “fonts/Marker Felt.ttf”, 30), this, menu_selector(Scene1::menuCallback));
改成MenuItemLabel* item = MenuItemLabel::create(Label::createWithTTF(“show scene2”, “fonts/Marker Felt.ttf”, 30), CC_CALLBACK_1(Scene1::menuCallback, this));
就是使用MenuItem时不将父指针传过去,就不会计算引用自增自减了。

这个问题已经修复。

https://github.com/cocos2d/cocos2d-x/issues/9690