我跟随raywnderlich的sample project进入我的第一个cocos2d应用程序。

在该应用程序中,如下添加了移动目标

-(void)addMonster
{
    __strong CCSprite * monster = [CCSprite spriteWithFile:@"monster.png"];
    CGSize winSize=[CCDirector sharedDirector].winSize;
    int minY=monster.contentSize.height/2;
    int maxY=winSize.height-minY;
    int rangY=maxY-minY;
    int actualY=(arc4random()%rangY)+minY;

    monster.position=ccp(winSize.width+monster.contentSize.width, actualY);
    [self addChild:monster];
    monster.tag=1;
    int minDuration=2.0;
    int maxDuration=4.0;
    int actualDuration=(arc4random()%(maxDuration-minDuration))+minDuration;

    CCMoveTo *actionMove=[CCMoveTo actionWithDuration:actualDuration
                                             position:ccp(-monster.contentSize.width/2, actualY)];
    CCCallBlock *actionDone=[CCCallBlock actionWithBlock:^(CCSprite *node){
        [node removeFromParentAndCleanup:YES];// crashed at this point
        [_monsters removeObject:node];

    }];
    [monster runAction:[CCSequence actions:actionMove,actionDone,nil]];
    [_monsters addObject:monster];
}


我从CCLayerColor子类(场景)的-init方法安排上述方法,如下所示

-(id)init
{
    // player adding code
    [self schedule:@selector(gameLogic) interval:1.0];
}
-(void)gameLogic
{
    [self addMonster];
}


即从iPad屏幕的左端移到右端

我的问题是,访问节点对象时,应用程序在CCCallBlock中崩溃

我没有下载源代码,而是计划从起点复制步骤,但是仍然找不到发布的位置。帮我同伴

更新:-
     我已经将崩溃的屏幕截图发布了

最佳答案

问题很简单,您正在使用的块不符合预期的接口。 CCCallBlock操作需要一个没有参数的块,但是您已将该块定义为接收参数(节点)。我很惊讶这甚至可以编译。当然,传入的节点将是垃圾指针,并且在访问时会崩溃。

要解决此问题,请使用CCCallBlockN,其块采用CCNode*指针作为参数:

CCCallBlockN *actionDone = [CCCallBlockN actionWithBlock:^(CCNode *node){
    // ...
    }];

关于ios - 在ARC启用的cocos2d项目中得到EXC_BAD_ACCESS错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21237381/

10-13 05:48