2012-05-11 8 views
0

レベルと2つのボタンを備えた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と呼ばれたオブジェクト、またはinitnewまたは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は一時的に、破壊可能な命令を持っています。あなたが言及したエラーが発生した場合、私は指示された行にブレークを置き、再実行し、スタックトレースを見ます。あなたがdev/testサイクルを完了し、そのようなことがあなたにとって重要な場合は、cocos2dを一時的な改造の元の状態に戻すことを忘れないでください。