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]()
Ответы
Ответ 1
Проверьте Как просмотреть содержимое переменной NSDictionary в отладчике Xcode?
Я также использую
po variableName
print variableName
в консоли.
В вашем случае можно выполнить
print [myData objectAtIndex:indexPath.row]
или
po [myData objectAtIndex:indexPath.row]
Ответ 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
Введите имя массива или все, что вы ищете.