2014-01-20 2 views
0

Я следовал за sample project от raywnderlich, чтобы отправиться в мое первое приложение cocos2d.Получил ошибку EXC_BAD_ACCESS в проекте ARC Enabled 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]; 
} 

И запланировать вышеупомянутый метод из -init метода моего CCLayerColor подкласса (сцены), как показано ниже

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

т.е. движется слева на правый конец экрана ipad

Моя проблема заключается в том, что приложение попало в CCCallBlock при доступе к объекту узла

Вместо загрузки источника я планировал реплицировать шаги с начальной точки, но до сих пор не могу найти, где он будет выпущен. помочь мне заглядывает

Update: - я разместил скриншоты в аварии enter image description here enter image description here

+0

сообщение The StackTrace. – 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

Я удаляю строку и все равно получаю сбой –