2011-12-11 18 views
0

私のプログラムがクラッシュする理由はわかりません。私はおおまかにどこがクラッシュしているのか分かります。コードは以下の通りで、クリアスプライト(1 × 480px)を追加し、ヒットした敵を削除します。コードは次のとおりです。キャッチされない例外 'NSInvalidArgumentException'

-(void)gunManAttack:(ccTime)dt { 
    int avalibleSpace = 210; 
    int minY = gunShot.contentSize.height/2; 
    int maxY = avalibleSpace - gunShot.contentSize.height/2; 
    int rangeY = maxY - minY; 
    int actualY = (arc4random() % rangeY) + minY; 

    int aOa; 
    BOOL allowAttackGun = YES; 

    NSMutableArray *enemiesToKill = [[NSMutableArray alloc] init]; 
    gunShot.position = ccp((gunShot.contentSize.width/2), actualY); 
    [self addChild:gunShot]; 

    CGRect gunShotRect = CGRectMake(
           gunShot.position.x - (gunShot.contentSize.width/2), 
           gunShot.position.y - (gunShot.contentSize.height/2), 
           gunShot.contentSize.width, 
           gunShot.contentSize.height 
           ); 

    for (CCSprite *enemy in allEnemies) 
    { 
     CGRect enemyARect = CGRectMake(
      enemy.position.x - (enemy.contentSize.width/2), 
      enemy.position.y - (enemy.contentSize.height/2), 
      enemy.contentSize.width, 
      enemy.contentSize.height 
     ); 

     if (CGRectIntersectsRect(gunShotRect, enemyARect) && allowAttackGun == YES) 
     { 
      [enemiesToKill addObject:enemy]; //Add to enemiesToKill array (clean up array [enemies]) 
      money = money + 100; //Add money for the kill 
      [moneyL setString:[NSString stringWithFormat:@"$ %i", money]]; //Update the money on the screen 
      aOa = 1; //Tell the aOa, the enemy was in the walking array 
      allowAttackGun = NO; //Prevent mutliple enemies from being killed (telling the program the attack has been completed) 
     } 
    } 

    for (CCSprite *enemy in attackingEnemies) 
    { 
     CGRect enemyARect = CGRectMake(
      enemy.position.x - (enemy.contentSize.width/2), 
      enemy.position.y - (enemy.contentSize.height/2), 
      enemy.contentSize.width, 
      enemy.contentSize.height 
     ); 

     if (CGRectIntersectsRect(gunShotRect, enemyARect) && allowAttackGun == YES) 
     { 
      [enemiesToKill addObject:enemy]; //Add to enemiesToKill array (clean up array [enemies]) 
      money = money + 100; //Add money for the kill 
      [moneyL setString:[NSString stringWithFormat:@"$ %i", money]]; //Update the money on the screen 
      aOa = 2; //Tell the aOa, the enemy was in the walking array 
      allowAttackGun = NO; //Prevent mutliple enemies from being killed (telling the program the attack has been completed) 
     } 
    } 

    //Removing enemies from arrays 
    for (CCSprite *enemyType1 in enemiesToKill) { 
     if (aOa==1) { //If the aOa is 1 (aka the enemy is in the walking array) 
      [allEnemies removeObject:enemyType1]; //Remove the enemy from the allEnemies (walking) array 
     } 
     if (aOa==2) { //If the aOa is 2 (aka the enemy is in the attacking array) 
      [attackingEnemies removeObject:enemyType1]; //Remove the enemy from the attackingEnemies (attacking) array 
     } 
     [self removeChild:enemyType1 cleanup:YES]; //Then remove the element from this array (due to the fact it has alredy been removed from the other arrays) 
    } 
    [enemiesToKill release]; 
    [self removeChild:gunShot cleanup:YES]; 
} 

デバッガ出力する:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString contentSize]: unrecognized selector sent to instance 0x80b7450' *** 

それはクラッシュのWHEREどのように見つけることができますか?あなたはどこかretainが欠落しているよう

+1

Xcodeデバッガを使用して段階的にデバッグしようとしましたか?アプリケーションのクラッシュを引き起こすラインコードを見つけるのに役立つかもしれません – Niko

+0

例外をスローする行をピンポイントするために例外ブレークポイントを追加してください:http://developer.apple.com/library/mac/#recipes/xcode_help-breakpoint_navigator/articles /adding_an_exception_breakpoint.html –

+0

[__NSCFString contentSize]が認識されないという例外があります。だからあなたは、あなたがしてはならないことにcontentSizeを呼んでいます。上記のコードでは、2つの異なるオブジェクトで呼び出します。 1つは敵で、もう1つはガンショットです。敵はCCSpriteとしてかなりよく見えますが、gunShotの定義は見えません。それはどこに定義されていますか?これらの2つのどちらでもない場合は、このメソッドの外部にバグがある可能性があります。 –

答えて

0

これが見えますので、あなたが使用しようとしているオブジェクトは、そのメモリを再利用、割り当て解除されます、そしてあなたは今NSStringある何かにメッセージ(contentSize)を送信してみてください。

ここで最も候補者の可能性が高いのはgunShotです。

ところで、NSZombiesを有効にしようとすると、デバッグに役立ちます。

+0

NSZombiesとは? – user1091516

+0

http://www.cocoadev.com/index.pl?NSZombieEnabled – jv42

関連する問題