当cocos2d在CCMenu中调用ccTouchEnded时发生EXC BAD ACCESS

时间:2012-06-23 00:42:37

标签: iphone ios cocos2d-iphone

这只会偶尔发生一次。当我按下菜单项调用的方法中的断点时,我在方法结束时结束,当我走出去时,我最终进入ccTouchEnded,然后发生错误访问。在调试输出窗口中没有显示任何内容,但是我得到一个绿色箭头,指向带有错误消息的main方法。

为什么会出现这种情况的想法?

感谢。

2 个答案:

答案 0 :(得分:1)

所以如果有人遇到同样的问题,我会弄清楚发生了什么。我有一个包含几个孩子的CCMenu。当一个孩子被点击时,我做了我想要的东西然后通过removeChild从CCMenu中删除它:cleanup:在我作为CCMenuItem的选择器传递的方法中。问题是Cocos2d在执行选择器方法时停用CCMenuItem,然后在方法完成时重新激活它。因此,在方法中,我基本上是通过从CCMenu中删除CCMenuItem来销毁它,然后在方法结束时Cocos2d尝试重新激活它,但它不再在内存中。

我没有看到很多方法,所以也许无法在其选择器方法中从CCMenu中删除CCMenuItem。

我解决它的方法是简单地在menuitem上调用setVisible:NO和setIsEnabled:NO。但是,我可以想象这不是最好的方法。也许在这些情况下你可能会弄乱z位置或某些东西以使菜单项不受影响。

无论如何,我希望这可以帮助别人,我知道我已经被困在这一段时间了。 :)

答案 1 :(得分:0)

在我看来,更好的解决方案是从堆栈中解除场景破坏调用。使用像NSTimer + BlockKit这样的东西让它变得非常干净。以下是我的代码的摘录:

- (void)menuAction
{
    // we use a timer here to delay the execution of the action because it
    // destroys the current scene and we're mid a call on CCMenu's ccTouchEnded
    // that isn't expecting a scene tear down
    // http://stackoverflow.com/questions/11165822/exc-bad-access-occurring-when-cocos2d-calls-cctouchended-in-ccmenu
    [NSTimer scheduledTimerWithTimeInterval:0 block:^(NSTimer* timer)
    {
       [[CCDirector sharedDirector] popSceneWithTransition:
         [CCTransitionSlideInL class] duration:kTransDur];
    }
    repeats:NO];
}