Отладчик Xcode: просмотр значения переменной


мой код в UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

как я могу видеть значения delegate.myData или indexPath.row в отладчике? delegate.myData должен быть массив и indexPath.row an int. Я могу видеть только адреса памяти объектов delegate и indexPath но где myData и row?

7 91

7 ответов:

проверить это как просмотреть содержимое переменной NSDictionary в отладчике Xcode?

Я также использую

po variableName
print variableName

в консоли.

в вашем случае можно выполнить

print [myData objectAtIndex:indexPath.row]  

или

po [myData objectAtIndex:indexPath.row]

Я согласен с другими плакатами, что Xcode как среда разработки должен включать простой способ отладки переменных. Ну, хорошие новости, есть одна!

после поиска и не найти простой ответ / учебник о том, как отлаживать переменные в Xcode я пошел, чтобы исследовать с самим Xcode и нашел это (по крайней мере для меня) очень полезное открытие.

как легко отлаживать переменные в Xcode 4.6.3

на главном экране Xcode убедитесь, что см. нижнюю область отладки, нажав кнопку в правом верхнем углу, показанную на скриншоте.

Debug Area button

Debug Area in Xcode 4.6.3

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

Breakpoint

теперь в области отладки найдите эту кнопку и нажмите на ту, что посередине. Вы заметите, что ваша область теперь разделена на два.

Split Debug Area

Should look like this

теперь запустите приложение.

когда первая точка останова будет достигнута во время выполнения вашей программы, вы увидите слева все ваши переменные, доступные в этой точке останова.

Search Field

вы можете развернуть стрелки влево на переменной для более подробной информации. И даже используйте поле поиска, чтобы изолировать эту переменную, которую вы хотите, и увидеть ее изменение в реальном времени, когда вы " входите" область действия точки останова.

Step Into

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

Contextual Menu

Как вы можете видеть, что контекстное меню есть очень интересные варианты отладки. Например,посмотреть это уже было предложено с помощью типизированных команд или даже Изменить Значение... это изменяет время выполнения значение переменной!

можно:

  1. установите точку останова для приостановки выполнения.
  2. объект должен находиться в области выполнения
  3. переместите указатель мыши на объект или переменную
  4. появится желтая подсказка
  5. наведите указатель мыши на всплывающей подсказке
  6. нажать на две маленькие стрелки, указывающие вверх и вниз
  7. появится контекстное меню
  8. выберите "описание печати" , он будет выполнять [объект описание]
  9. описание появится в выводе консоли

имхо немного скрытый и громоздкий...

ваше замешательство связано с тем, что объявленные свойства не являются (обязательно называются так же, как) (экземпляр) переменные.

на термин

indexPath.row

эквивалентно

[indexPath row]

и назначении

delegate.myData = [myData objectAtIndex:indexPath.row];

эквивалентно

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

предполагая стандартное именование для синтезированных свойств.

кроме того, delegate вероятно, объявлен как тип id<SomeProtocol>, т. е. компилятор не смог предоставить фактическую информацию о типе для delegate в этот момент, и отладчик полагается на информацию, предоставленную во время компиляции. Так как id является универсальным типом, нет информации о времени компиляции о переменных экземпляра в delegate.

вот почему вы не видите myData или row как переменные.

если вы хотите проверить результат отправки -row или -myData, вы можете использовать команды p или po:

p (NSInteger)[indexPath row]
po [delegate myData]

или используйте окно выражения (например, если вы знаете свой delegate имеет фактический тип MyClass *, вы можете добавить выражение (MyClass *)delegate, или щелкните правой кнопкой мыши delegate выберите View Value as… и введите фактический тип delegate (например,MyClass *).

при этом, я согласен, что отладчик может быть более полезным:

  • может быть возможность указать окну отладчика использовать информацию о типе времени выполнения вместо информация о времени компиляции. Это замедлит отладчик, конечно, но предоставит полезную информацию;

  • объявленные свойства могут отображаться в группе под названием Свойства и разрешать (необязательно) проверку непосредственно в окне отладчика. Это также замедлит работу отладчика из-за необходимости отправки сообщения/выполнения метода для получения информации, но также предоставит полезную информацию.

вы можете печатать значения в окно консоли во время выполнения. Ниже приведены шаги :

  1. поместите точку останова, для которой вы хотите получить значения
  2. Теперь выполните пошаговую отладку.
  3. поместите курсор на переменную / делегат, значение которого должно быть проверено во время выполнения.
  4. Теперь это покажет описание переменной / делегата
  5. при нажатии на "i" появится подробное описание
  6. Это также напечатает детали на консоль окно.

Screenshot for printing details on console window

это становится немного сложным. Эти объекты являются пользовательскими классами или структурами, и заглянуть в них не так просто в Xcode, как в других средах разработки.

на вашем месте, я бы NSLog значения, которые вы хотите увидеть, с некоторым описанием.

Я.е:

NSLog(@"Description of object & time: %i", indexPath.row);

Попробуйте Выполнить - > Показать - > Выражения

введите имя массива или то, что вы ищете.