2014-01-20 44 views
0

我跟着來自raywnderlich的sample project冒險進入我的第一個cocos2d應用程序。在啓用ARC的cocos2d項目中出現EXC_BAD_ACCESS錯誤?

在該應用程序的移動目標添加像下面

-(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

我沒有下載源文件,而是計劃從起點複製這些步驟,但仍無法找到它的發佈位置。幫我同行

更新: - 我已經發布的截圖在崩潰 enter image description here enter image description here

+0

郵棧跟蹤。 – trojanfoe

+0

可能是節點無效,並在此之前釋放...請給出一些更多的代碼和堆棧跟蹤... –

+0

@trojanfoe我已發佈屏幕截圖 –

回答

4

問題很簡單,你正在使用的塊不符合預期的接口。 CCCallBlock動作需要一個沒有參數的塊,但是您將塊定義爲接收參數(節點)。我很驚訝,這甚至編譯。當然,傳入的節點在訪問時將成爲垃圾指針並崩潰。

爲了解決這個問題利用CCCallBlockN其塊需要一個CCNode*指針作爲參數:

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

具有不兼容參數的塊只會生成警告。這可能是這裏發生的事情(請參閱屏幕截圖中的小黃色三角形)。 –

+2

「將警告視爲錯誤」的另一個原因是 – LearnCocos2D

0

貌似問題是即將在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之:,選擇一個東西,你不能刪除的東西兩次

+0

對不起,這是我的錯誤我在帖子中刪除了兩次節點,現在我刪除了該行[self removeChild:node] –

+0

,這樣有幫助嗎?在屏幕截圖上,您正在刪除兩次 –

+0

我刪除該行並仍然崩潰 –

相關問題