Memory management cocos2d帮助:未选中CCMenuItem';EXC#u坏访问';和CCCallFunc

Memory management cocos2d帮助:未选中CCMenuItem';EXC#u坏访问';和CCCallFunc,memory-management,cocos2d-iphone,selector,exc-bad-access,ccaction,Memory Management,Cocos2d Iphone,Selector,Exc Bad Access,Ccaction,我对CCMenuItem及其与CCCallFunc的计时一直有问题 基本上我得到的是“EXC\u BAD\u ACCESS” @CCMenuItem类的此行 -(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { ... [selectedItem_ unselected]; // EXC_BAD_ACCESS [selectedItem_ activate]; ... } 在触摸结束

我对CCMenuItem及其与CCCallFunc的计时一直有问题

基本上我得到的是“EXC\u BAD\u ACCESS”

@CCMenuItem类的此行

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    ...
    [selectedItem_ unselected]; // EXC_BAD_ACCESS
    [selectedItem_ activate];
    ...
}
在触摸结束之前,菜单项似乎已解除分配。我正在使用CCCallFunc调用一个“removeThisSprite”方法,该方法将其从父级中移除

所以我调用的CCMenuItem序列的最后一个动作是:

[CCCallFuncO actionWithTarget:self selector:@selector(removeThisSprite:) object: _currentButton]
removeThisSprite方法如下:

CCMenuItemSprite2 *sender = nil;
sender.isEnabled = NO;

if ([_sender isKindOfClass:[CCMenuItemSprite class]]) {
    sender = _sender;
    [sender removeFromParentAndCleanup: YES];
}

这通常发生在玩家点击屏幕时,但除非点击很快,否则不会发生。这很可能发生在我正在制作的游戏中。我猜玩家按下按钮太快可能会出现计时问题。

您可以尝试延迟删除菜单项:

[self performSelector:@selector(removeMenuItem:) withObject:sender afterDelay:0.1f];

...

-(void) removeMenuItem:(id)sender
{
   if ([sender isKindOfClass:[CCMenuItemSprite class]])
   {
      [sender removeFromParentAndCleanup: YES];
   }
}