Как установить «умную» точку останова в XCode, когда метод возвращает конкретное значение? - PullRequest
1 голос
/ 19 января 2011

У меня есть метод, который возвращает значение bool с несколькими точками выхода. Однако, похоже, что он работает неправильно, поэтому я хотел бы установить автоматическую точку останова, чтобы увидеть, когда она возвращает значение YES, чтобы я мог проверить все переменные и вычисления в отладчике. Я хотел бы остановить отладчик всякий раз, когда возвращается значение YES.

У меня установлена ​​аналогичная интеллектуальная точка останова для 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: /248054/obnaruzhenie-stolknoveniya-okruzhnosti-s-pryamougolnikom-peresechenie#248064

    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 (прошедшее время) в качестве аргумента, поэтому я не могу проверить, что происходит кадр за кадром - всякий раз, когда я продолжаю выполнение, мне представляется другая сцена.

(я использую cocos2d в коде)

Ответы [ 2 ]

1 голос
/ 19 января 2011

Вы можете установить условные контрольные точки.С небольшим изменением update:

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

вы можете установить точку останова как обычно после назначения BOOL (то есть на линии if), затем щелкните правой кнопкой мыши на синей точке остановаи выберите «Показать пузырь сообщения» и добавьте collided в качестве условия.Дополнительная переменная должна быть оптимизирована в режиме сборки Release.

0 голосов
/ 19 января 2011

Если вы используете локальную возвращаемую переменную:

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

Вы можете просто установить точку наблюдения на ret

В противном случае, вы, вероятно, застряли при переходе черезкод - надеюсь, что какая-то умная комбинация условных точек останова поможет вам не прерывать каждый вызов.Установка метода точки останова, как вы делаете с objc_exception_throw, не сработает, потому что он будет останавливаться при каждом вызове, а изменение возвращаемого значения на вызывающем сайте слишком поздно, чтобы выяснить, как вы туда попали.

Если вы можете опубликовать код, мы сможем оказать более конкретную помощь в отношении стратегии отладки.Удачи.: -)

...