2 Разработка Mac-приложений на примерах. Отладка

Чтобы показать окно отладки, нужно нажать на кнопку Hide or show the Debug area
в правом верхнем углу экрана. 

Окно отладки появляется самостоятельно в следующих случаях:
- когда программа пытается получить доступ к участку памяти, который ей не принадлежит;
- когда выполняется деление целых чисел на 0;
- когда выполняется доступ к объекту, который уже был освобожден (released) или обработан сборщиком мусора (garbage collected) - так называемые dangling pointers.

Пример.
В предыдущем проекте SimpleCalc в файле BTSAppDelegate.m определим константу:
#import "BTSAppDelegate.h"

#define D_SHOW_DIVIDEBYZERO_BUG 1

В том же файле изменим объявление переменных:
#if D_SHOW_DIVIDEBYZERO_BUG
    int l_value1 = [mValue1 doubleValue];
    int l_value2 = [mValue2 doubleValue];
#else
    // Get a double precision number from the
    // first text field
    double l_value1 = [mValue1 doubleValue];
    // Get a double precision number from the
    // second text field
    double l_value2 = [mValue2 doubleValue];
    // Create a double precision variable to
    // hold the result of l_value1 <op> l_value2
#endif

Это называется условной компиляцией.

Теперь если запустить деление, то возникнет ошибка:

В области отладчика, если развернуть self можно видеть значение членов AppDelegate.

Бываю также случаи, когда окно отладчика не появляется автоматически:
- неверное значение параметра в сообщении;
‹- отправка сообщения объекту, который не знает как обрабатывать это сообщение.

Пример.

Определим директиву:
#import "BTSAppDelegate.h"

#define D_SHOW_DIVIDEBYZERO_BUG 0
#define D_SHOW_INDEXOUTOFRANGE_BUG 1

Изменим код BTSAppDelegate.m следующим образом:
/*
 Create the App implementation for the buttons
 */
- (IBAction)myButtonAction:(id)a_sender;
{
    // Use an array to hold the valid operations
    NSArray *l_validOperations = [NSArray arrayWithObjects: @"+",
                                  @"-",
                                  @"x",
                                  @"÷",
                                  nil];
    
    // For now, just beep
    // Comment out the beep, we don't need it
    // NSBeep();
    // Get the button title (+, -, x, or ÷) to
    // determine which operation the App will
    // preform
    NSString *l_operation = [a_sender title];
    
#if D_SHOW_DIVIDEBYZERO_BUG
    int l_value1 = [mValue1 doubleValue];
    int l_value2 = [mValue2 doubleValue];
#else
    // Get a double precision number from the
    // first text field
    double l_value1 = [mValue1 doubleValue];
    // Get a double precision number from the
    // second text field
    double l_value2 = [mValue2 doubleValue];
    // Create a double precision variable to
    // hold the result of l_value1 <op> l_value2
#endif
    
    double l_result;
    
    // If the operation was addition, then
    // add the two values
    if ([[l_validOperations objectAtIndex:0]
         isEqual: l_operation])
    {
        l_result = l_value1 + l_value2;
    }
    // If the operation was subtraction, then
    // subtract the two values
    else if ([[l_validOperations objectAtIndex:1]
              isEqual: l_operation])
    {
        l_result = l_value1 - l_value2;
    }
    // If the operation was multiplication, then
    // multiply the two values
    #if D_SHOW_INDEXOUTOFRANGE_BUG
        else if ([[l_validOperations objectAtIndex:22]
                  isEqual: l_operation])
#else
            else if ([[l_validOperations objectAtIndex:2]
                      isEqual: l_operation])
#endif 
            {
                l_result = l_value1 * l_value2;
}
// The operation must have been division, so
// divide the first value by the second value
else
{
    l_result = l_value1 / l_value2;
}

    // Set the result text field to the result
    [mResult setDoubleValue:l_result];
}

Перед запуском программы лучше делать Product -> Clean, чтобы удалить старые версии.

При запуске этого примера окно отладчика не появится автоматически. Чтобы появилось нужно сделать следующее: