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


107

Мой код в UITableViewController:

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

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

альтернативный текст

Ответы:


142

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

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

po variableName
print variableName

в консоли.

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

print [myData objectAtIndex:indexPath.row]  

или

po [myData objectAtIndex:indexPath.row]

Спасибо! Я много пробую: «print [myData objectAtIndex: indexPath.row]», «po [myData objectAtIndex: indexPath.row]», «print indexPath.row», «po indexPath.row», ... Но каждый раз я получил сообщение «Нет элемента с именем row». Это работает: «print indexPath» и «po indexPath». Поэтому я попытался использовать «[]» вместо «.»: «Po [indexPath row]» -> «Невозможно распечатать описание объекта NIL». «po [indexPath getRow]» -> «Цель не отвечает на этот селектор сообщений». :-(
Manni

4
попробуйте print (int) [indexPath row]
Андрей

po [myData objectAtIndex: (int) [indexPath row]]
Андрей

@VanDuTran Я почти уверен, что эквивалент po objв быстром po print(obj).
Крис

Это также идеально подходило для поиска значений вычисленных свойств. Спасибо!
Paula Hasstenteufel

26

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

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

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

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

Кнопка области отладки

Область отладки в Xcode 4.6.3

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

Точка останова

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

Разделить область отладки

Должно выглядеть так

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

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

Поле поиска

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

Шаг в

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

Контекстное меню

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


21

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

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

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


В моем xcode «Описание печати» не работает, так как я могу его включить?
Киртикумар А.

@kirtiavaiya приложение должно быть приостановлено, а ваша переменная должна находиться внутри текущей области видимости для печати. Также вы не можете напечатать "self.variable" напрямую, но вы можете использовать решение Андрея для печати _ <имя переменной>. Например: для self.btnHello напишите в консоли «po _btnHello» (это работает, только если вы не изменили имя метода получения)
LightMan

@LightMan да, это, как вы сказали, но тоже не работает
Киртикумар А.

10

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

Выражение

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

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

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

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


Спасибо за объяснение! Это мне очень помогло! :-)
Manni

7

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

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

Снимок экрана для печати деталей в окне консоли


1
Работает ли это на swift, я новичок в swift, не могу видеть значения объекта, как мы используем для просмотра в obj c.
umairhhs

1
@umairhhhs Этот пост предназначен только для Objective-C.
Джайпракаш Дубей

1
Мне интересно, почему этого нет в быстром редакторе, потому что это очень помогает и экономит время.
umairhhs

1

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

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

то есть:

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

11
Да, NSLog - это возможность, но не удобная альтернатива отладке. Я очень удивлен, что нет возможности отобразить нужные значения. Это относится к базовой функциональности среды разработки.
Manni

2
Самое раздражающее в XCode. Жалкий.
ryan0 03

1

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

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


Спасибо! Я ввел "indexPath.row" и "delegate.myData" в окно выражения, но каждый раз появляется "вне области видимости" в столбце "Сводка" :-(
Manni

np, у меня была такая же проблема, пока я ее не нашел;)
tbone

1
установите точку останова сразу после того, как вы установили свой массив или что-то еще, и вы должны найти значение в выражениях. Удачи
tbone
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.