Xcode Debugger: просмотр значения переменной

Мой код в UITableViewController:

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

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

alt text

Ответ 2

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

  • Установите точку останова, чтобы приостановить выполнение.
  • Объект должен находиться внутри области выполнения
  • Переместите указатель мыши над объектом или переменной
  • Появится желтая подсказка
  • Наведите курсор мыши на подсказку
  • Нажмите на две маленькие стрелки, указывающие вверх и вниз
  • Появится контекстное меню
  • Выберите "Описание печати", он выполнит описание [описание объекта]
  • Описание появится на выходе консоли

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

Ответ 3

Я согласен с другими плакатами в том, что 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

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

Хорошо, надеюсь, это помогло вам. Пожалуйста, проголосуйте!

Ответ 4

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

Экспрессия

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

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

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

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

Ответ 5

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

  • Поместите точку останова, для которой вы хотите получить значения
  • Теперь выполните пошаговую отладку.
  • Поместите курсор на переменную/делегат, значение которого должно быть проверено во время выполнения.
  • Теперь это покажет описание переменной/делегата
  • Нажав на "i", вы увидите подробное описание
  • Это также будет печатать информацию в окне консоли.

Screenshot for printing details on console window

Ответ 6

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

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

то есть:

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

Ответ 7

Попробуйте выполнить Run- > Show- > Expressions

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