0

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

任何想法为什么会发生这种情况?

谢谢。

4

2 回答 2

1

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

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

我解决它的方法是在菜单项上简单地调用 setVisible:NO 和 setIsEnabled:NO。但是,我可以想象这不是最好的方法。也许在这些情况下,您可能会弄乱 z 位置或其他东西来让菜单项不碍事。

无论如何,我希望这对其他人有所帮助,我知道我已经坚持了一段时间。:)

于 2012-06-23T05:48:25.280 回答
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];
}
于 2013-11-09T18:45:07.777 回答