auto i_begin=Sprite::createWithSpriteFrameName("begin.png"); auto i_begin2=Sprite::createWithSpriteFrameName("begin2.png"); auto uiStartBtn=MenuItemSprite::create(i_begin,i_begin2,i_begin2,this,menu_selector(MenuScene::menuStartCallback)); uiStartBtn->setPosition(Vec2(visibleSize.width*0.1f,visibleSize.height*0.7f)); ``` 上面是按钮的代码void MenuScene::menuStartCallback(cocos2d::Object* pSender){ //tansform to MenuScene auto transformScene=CCTransitionSlideInL::create(1.5f,MainScene::playGame()); Director::getInstance()->replaceScene(transformScene); } ``` 上面跳转的代码 在新场景中我所有的按钮事件还在,这是为什么?前面的内存都没有释放掉吧?是不是我按钮事件加的方式不对? 怎么在场景切换之间调用一个onexit之类的函数来手动释放原场景的内存呢?
问题应该不在这里吧···
是不是原来的Scene你另外保存未清除,导致自动回收不生效?
我应该没有另外保存啊
我在退出事件onExit()函数加入一个诸如
pSprite->release()
的代码,程序就出错了
调试下呗。
加个数据断点,看看MenuScene的ref数变化。
感觉你对cocos2d-x内存模型理解有偏差····具体你可以搜下文章看看,这里有一篇不错的。
http://blog.leafsoar.com/archives/2013/06-04.html
Node::onExit()是node从parent上卸除时调用的,不是删除时调用的。而且sprite这种,一般情况下你不会手动调用到release的····即使需要retain/release,这事也应该由RefPtr来做。
为什么我的事件还在?
我现在的解决方式是在onExit()里面把按钮禁用,这样事件是没问题了,但是理论上menuscene不是应该在replace之后内存就释放了吗
第一:奇怪你的按钮怎么加的,如果按钮挂载在之前的scene下,现在切换了scene,又怎么会出现在新的scene里面?
第二:scene的内存不应该是手动管理的。Replacescene之后如果没有其他地方引用,当然会被释放掉。
1.我的按钮并没有出现在其他scene,只是在相同位置上,我点击了有事件
2.就是说啊,我也想他自动释放掉,我的scene要么没有释放,要么就是释放不完全,事件还残留了