0

レベルと 2 つのボタンを備えた nsmutablearray があります。次のレベルにして、もう一度やり直してください。ユーザーが次のレベルに触れたときに objectAtIndex:indexCurrLevel+1 を設定すると、次のレベルが問題なくロードされます。しかし、ユーザーがもう一度試してみて、レベルを objectAtIndex:indexCurrLevel に設定しようとすると、アプリがクラッシュし、子が既に追加されているというエラーが発生しました。手動で設定した場合、元に再試行するため、それはクレイジーです。objectAtIndex:5 は、アプリがクラッシュしたため、ユーザーが 5 レベルでプレイしない限り、完全に機能します。

現在のレベルのインデックスとは異なるインデックスの場合、完全に機能します。(objectAtIndex: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: -[Game addChild:z:tag:], ../libs/cocos2d/CCNode.m:388 2012-05-11 19:03:20.349 Game[932:10a03] でアサーション失敗* キャッチされないためアプリを終了例外 'NSInternalInconsistencyException'、理由: '子は既に追加されています。再度追加することはできません' *最初のスロー コール スタック:

4

3 に答える 3

0

配列境界の問題を推測しますが、コードサンプルまたはクラッシュログなしで検証することは不可能です。

于 2012-05-11T14:09:43.600 に答える
0

ステートメントを削除してみてください[l release]。一般に、 、またはretainで始まるメソッドを使用して取得した、 またはを呼び出したオブジェクトのみを解放する必要があります。配列は各レベルも保持するため、レベルの所有者として残すことが適切な場合があります。Xcode で静的アナライザーを実行して、これらの問題を検出します。initnewcopylevels2

于 2012-05-12T01:57:39.440 に答える
0

メッセージを読んでください: 既に親を持つオブジェクトを addChild しようとしています...つまり、コード ベースの別の場所に CCNode 子孫の子として既に追加されています。CCNode の 388 行目は NSAssert であり、壊れることはありません。次のように、CCNode を一時的に変更して、ブレーク可能な命令にします。

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 (私のプロジェクト) からのものです。あなたが言及したエラーが発生した場合、私は示された行にブレークを置き、再実行し、スタック トレースを調べます。開発/テスト サイクルが完了し、そのようなことが重要な場合は、そのような一時的な mod のために cocos2d を元の状態に復元することを忘れないでください。

于 2012-05-12T03:48:51.083 に答える