最近在使用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时不将父指针传过去,就不会计算引用自增自减了。
