【问题标题】:Got EXC_BAD_ACCESS error in ARC Enabled cocos2d Project?在 ARC Enabled cocos2d 项目中出现 EXC_BAD_ACCESS 错误?
【发布时间】:2014-01-20 15:08:10
【问题描述】:

我跟随 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 中崩溃

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

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

【问题讨论】:

  • 可能是节点无效并在此之前被释放...请提供更多代码和堆栈跟踪...
  • @trojanfoe 我已经发布了屏幕截图
  • @C_X 我已经发布了屏幕截图

标签: ios cocos2d-iphone ccnode


【解决方案1】:

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

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

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

【讨论】:

  • 参数不兼容的块只会产生警告。这可能就是这里发生的事情(见截图中的黄色小三角形)。
【解决方案2】:

看起来问题是要在 actionDone 中进行大量清理。

You add monster to self (+1), 
add to array _monsters (+1), 
then remove [node removeFromParentAndCleanup:YES]; (-1), 
[_monsters removeObject:node]; (-1), 
[self removeChild:node]; (-1)
+2, -3 —> bad access

另外(在这种特殊情况下)您尝试删除节点两次,首先通过 removeFromParentAndCleanup:,然后从父级 removeChild:,选择一个,您不能删除两次

【讨论】:

  • 抱歉是我的错误,我在 post 中删除了两次节点,现在我删除了 [self removeChild:node]
  • 这样有帮助吗?在屏幕截图上,您要删除两次
  • 我删除该行仍然崩溃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多