带有CCCallFunc的@selector multiple Arguments错误

时间:2011-11-24 07:10:52

标签: iphone ios cocos2d-iphone

我正在尝试这个东西,但在下一个方法中有运行时错误,即changeCardsfirst2我无法找到出错的地方。请建议我这个错误

-(void) changeFirst2Cards : (CCSprite *) chgcard0 :(CCSprite *) chgcard1
{
    id a1 = [CCDelayTime actionWithDuration:0.5f];
    id a2 = [CCCallFunc actionWithTarget:self selector:@selector(changeCardsfirst2:data:)  ];
    id action = [CCSequence actions:a1,a2,nil];

    [self runAction:action];
}
-(void) changeCardsfirst2 : (id) sender data:(CCSprite *)chgcard1
{
    [chgcard1 runAction:[CCMoveTo actionWithDuration:0.5f position:ccp(145,wSize.height-110)]]; // Error for EXEC_BAD EXCCESS
}

感谢提前建议

2 个答案:

答案 0 :(得分:3)

您的选择器不使用CCCallFunc所需的参数 - 它应该没有参数。 CCCallFuncN将以节点作为其第一个参数运行选择器,CCCallFuncND将运行带有节点的选择器和任意void *指针作为其第二个参数。

你应该使用CCCallFuncN:

id a2 = [CCCallFuncN actionWithTarget:self 
                             selector:@selector(changeCardsfirst2:)];

并相应地更改选择器以使用节点:

-(void) changeCardsfirst2:(CCNode*)chgcard1
{
    id move = [CCMoveTo actionWithDuration:0.5f 
                                  position:ccp(145,wSize.height-110)];
    [chgcard1 runAction:move];
}

答案 1 :(得分:1)

唯一可能的原因是chgcard1早先在某处被过度释放。 我从来没有使用过Cocos,但是如果你没有源代码并使用静态库,那么只需创建CCSprite的类别并覆盖dealloc方法(这只是为了查看它何时被调用此对象)。如果您正在使用Cocos源构建,那么只需在那里创建一个断点。