Отладчик Xcode: просмотр значения переменной - PullRequest
94 голосов
/ 19 января 2011

Мой код в UITableViewController:

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

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

alt text

Ответы [ 7 ]

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

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

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

po variableName
print variableName

в консоли.

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

print [myData objectAtIndex:indexPath.row]  

или

po [myData objectAtIndex:indexPath.row]
22 голосов
/ 23 июля 2013

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

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

Как легко отладить переменные в 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

Как видите, это контекстное менюполон очень интересных вариантов отладки.Например, Watch , который уже был предложен с набранными командами, или даже Edit Value… , который изменяет значение времени выполнения вашей переменной!

19 голосов
/ 17 февраля 2012

Также вы можете:

  1. Установить точку останова, чтобы приостановить выполнение.
  2. Объект должен находиться внутри области выполнения
  3. Наведите указатель мыши на объект или переменную
  4. Появится желтая подсказка
  5. Наведите указатель мыши на подсказку
  6. Нажмите на две маленькие стрелки, указывающие вверх и вниз
  7. Всплывет контекстное меню
  8. Выберите «Print Description», оно выполнит [описание объекта]
  9. Описание появится в выводе консоли

ИМХО немного скрыто и громоздко ...

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

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

Выражение

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 *).

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

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

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

6 голосов
/ 25 августа 2014

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

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

Screenshot for printing details on console window

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

Попробуйте Run-> Show-> Expressions

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

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

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

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

т.е:

NSLog(@"Description of object & time: %i", indexPath.row);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...