2012-05-11 1 views
0

레벨과 버튼이 두 개인 nsmutablearray를 사용했습니다. 다음 단계로 가서 다시 시도하십시오. 사용자가 다음 레벨을 터치하면 objectAtIndex : indexCurrLevel + 1을 설정하고 다음 레벨이 문제없이로드됩니다. 하지만 사용자가 다시 시도하고 objectAtIndex 수준으로 설정하려고하면 indexCurrLevel 앱이 이미 오류가 추가 된 어린이와 충돌합니다. 수동으로 설정하면 전 (前)을 다시 시도하기 때문에 미친 것입니다. objectAtIndex : 5는 사용자가 5 단계에서 재생하지 않을 때까지 완벽하게 작동합니다. 앱이 다운 되었기 때문입니다.cocos2d - NSMutableArray 레벨, 재시작 레벨 및 크래시, 다음 레벨이 좋음

현재 색인과 다른 색인의 경우 완벽하게 작동합니다. (objectAtIndex : index - works) index를 수동으로 설정하면 index와 같은 이유가 나타납니다.

[self removeFromParentAndCleanup:YES]; 

    Levels *l = [levels2 objectAtIndex:index-1]; 
    Game *hl = [[Game alloc]initWithObstacles:[l staticO] :[l rotateO]:[l lvl]:[l level]:[l pendulumO]:self.levelsArray]; 
    [hl setLevels2:self.levels2]; 
    [hl setBasketY:[l basketY]]; 
    [hl setBasketX:[l basketX]]; 


    [l release]; 

    [[CCDirector sharedDirector] replaceScene:(CCScene*) hl];  
    [hl configureLevel]; 
    [hl release]; 

Eroor : 의 어설 션 오류 - [게임하는 AddChild : Z : 태그 :] ../libs/cocos2d/CCNode.m:388 2012-05-11 19 : 03 : 20.349 게임 [ 932 : 10a03] * 캐치되지 않은 예외 'NSInternalInconsistencyException'으로 인해 앱 종료 중, 이유 : '자식이 이미 추가되었습니다. 다시 추가 할 수 없음 ' * 첫 번째 던지기 호출 스택 :

+0

실제 코드와 실제 오류 메시지가 나타난다면 도움이 될 것입니다. –

답변

0

코드 샘플이나 충돌 로그 없이는 확인할 수 없습니다.

0

[l release] 문을 삭제 해보세요. 일반적으로 retain이라고 불렀거나 init, new 또는 copy으로 시작하는 메서드를 사용하여 얻은 개체 만 릴리스해야합니다. 배열 levels2도 각 레벨을 유지하며 레벨 소유자로 두는 것이 적절할 수 있습니다. 이러한 문제를 해결하려면 Xcode에서 정적 분석기를 실행하십시오.

0

메시지를 읽으십시오 : 이미 부모가있는 객체를 addChild하려고합니다. 즉, 코드베이스의 다른 곳에서 CCNode 자손의 자식으로 이미 추가되었습니다. CCNode의 388 행은 NSAssert이며 깨지지 않습니다.

if (nil==child) { 
    CCLOG(@"%@<addChild> : have nil child. not adding.",self.class); 
    return; 
} 
if (child.parent) { 
    CCLOG(@"%@<addChild> : This child is already added somewhere. not adding.",self.class); // **** PUT BREAKPOINT HERE *****// 
    return; 
} 

NSAssert(child != nil, @"Argument must be non-nil"); // was line 388 
NSAssert(child.parent == nil, @"child already added. It can't be added again"); 

지난 2 개 라인 (내 프로젝트) CCNode 출신 다음과 같이 변경 CCNode는 일시적으로 깨지기 명령을합니다. 언급 한 오류가 발생하면 표시된 줄에 중단 점을 넣고 재실행하고 스택 추적을 봅니다. 개발/테스트 사이클을 마치고 그런 일이 중요 할 때 cocos2d를 임시 모드에 대한 원래 상태로 복원하는 것을 잊지 마십시오.