как установить интеллектуальную точку останова в Xcode, когда метод возвращает определенное значение?

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

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


person antalkerekes    schedule 19.01.2011    source источник
comment
Вы также можете переключить точку останова objc_exception_throw через Run->Stop для исключений Objective-C.   -  person Art Gillespie    schedule 19.01.2011


Ответы (2)


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

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

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

person Richard    schedule 19.01.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, не будет работать, потому что она будет останавливаться при каждом вызове, а прерывание возвращаемого значения на вызывающем сайте слишком поздно, чтобы понять, как вы туда попали.

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

person Art Gillespie    schedule 19.01.2011