2011-01-19 8 views
1

私はbool値を返し、いくつかの終了点を返すメソッドを持っています。 しかし、正しく動作していないようですので、自動ブレークポイントを設定してYES値を返すようにしたいので、デバッガですべての変数と計算をチェックできます。 YESの値が返されるたびにデバッガを停止したいと考えています。メソッドが特定の値を返すときにXcodeで "スマート"ブレークポイントを設定する方法は?

私はobjc_exception_throwに設定された同様のスマートブレークポイントを持っていますので、それが可能であることを知っています。


(ケースで、それは誰も、あなたが例外ブレークポイントを設定することができる方法ができます:ブレークポイントウィンドウで(ファイル名を指定して実行 - >表示 - >ブレークポイント)は、「ブレークポイント」としてobjc_exception_throwを入力し、「場所」としてlibobjc.A.dylib

編集:私はそれを使用したい特定のコード:

- (BOOL)collisionOccured { 
    // Assumption: helicopter is of square shape (collision calculated by radius), walls are rectangles 
    // This approach is based on the solution seen here: http://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection/402010#402010 

    float helicopterImageWidth = [helicopter texture].contentSize.width; 
    float wallImageWidth = [[walls lastObject] texture].contentSize.width; 
    float wallImageHeight = [[walls lastObject] texture].contentSize.height; 
    float helicopterCollisionRadius = helicopterImageWidth * 0.4f; 

    CGPoint helicopterPosition = helicopter.position; 


    int numWalls = [walls count]; 
    for (int i = 0; i < numWalls; i++) { 
     CCSprite *wall = [walls objectAtIndex:i]; 

     if ([wall numberOfRunningActions] == 0) { 
      // The wall is not moving, we can skip checking it. 
      continue; 
     } 

     CGPoint wallPosition = wall.position; 

     float helicopterDistanceX = abs(helicopterPosition.x - wallPosition.x - wallImageWidth/2); 
     float helicopterDistanceY = abs(helicopterPosition.y - wallPosition.y - wallImageHeight/2); 

     if (helicopterDistanceX > (wallImageWidth/2 + helicopterCollisionRadius)) { return NO; } 
     if (helicopterDistanceY > (wallImageHeight/2 + helicopterCollisionRadius)) { return NO; } 

     if (helicopterDistanceX <= (wallImageWidth/2)) { return YES; } 
     if (helicopterDistanceY <= (wallImageHeight/2)) { return YES; } 

     float cornerDistance_sq = powf((helicopterDistanceX - wallImageWidth/2), 2) + 
           powf((helicopterDistanceY - wallImageHeight/2), 2); 

     return (cornerDistance_sq <= powf(helicopterCollisionRadius, 2)); 
    } 

    // this should not occur 
    return NO; 
} 

このメソッドは、

- (void)update:(ccTime)delta { 
    if ([self collisionOccured]) { 
     NSLog(@"A collision occured"); 
    } 
} 
経由で呼び出され

問題は、更新メソッドが引数としてdelta(時間が経過した)を取るため、フレームごとに何が起きているのかを確認できないためです。実行を続けると、別のシーンが表示されます。あなただけのそれ以外の場合はret

上のウォッチポイントを設定することができ

- (BOOL)someMethod { 
    BOOL ret = NO; 
    if (something) { 
     ret = YES; 
    } else if (something_else) { 
     ret = YES; 
    } 
    // ... and so on 
    return ret; 
} 

あなたは:あなたがローカル戻り変数を使用している場合

+0

Objective-C例外でRun-> Stopを使用してobjc_exception_throwブレークポイントを切り替えることもできます –

答えて

1

条件付きブレークポイントを設定できます。 update:

- (void)update:(ccTime)delta { 
    BOOL collided = [self collisionOccured]; 
    if (collided) { 
     NSLog(@"A collision occured"); 
    } 
} 

にわずかな微調整を使用すると、その後、青色のブレークポイントの矢印を右クリックし、 『表示メッセージバブル』(すなわちifライン上)BOOLの割り当て後に通常通りにブレークポイントを設定することができます条件としてcollidedを追加します。リリースビルドモードでは、余分な変数を最適化する必要があります。

0

(私は、コード内でcocos2dを使用しています)おそらくコードをステップ実行することに悩まされているでしょう - 条件付きブレークポイントのいくつかの巧妙な組み合わせが、すべての呼び出しを中断する必要はないでしょう。 objc_exception_throwと同じようにメソッドブレークポイントを設定すると、呼び出しごとに停止し、呼び出し元サイトの戻り値を破棄するのが遅すぎて、そこに到達した方法がわかりません。

コードを投稿できる場合は、デバッグ戦略についてより具体的なヘルプを提供できる場合があります。がんばろう。 :-)

+0

上記のコードを追加しました – antalkerekes

関連する問題