Интеллектуальное содержимое переменной Obj-C при отладке в Xcode? - PullRequest
8 голосов
/ 14 июля 2010

В своей конфигурации по умолчанию (т.е. моей) XCode несколько бесполезен в своем окне отладчика для переменных, особенно из общего набора коллекций Objective-C.

Кажется, что отладчик обычно хочет отобразитьлежащая в основе структуры Obj-C, когда я раскрываю некоторый объект, поэтому я смотрю на isa s и иерархию классов.

Но то, что я почти всегда хочу здесь, это нечто семантически значимое для самого объекта.Например, для NSDictionary в идеале я бы хотел увидеть список ключей / значений.Если эти ключи и значения, например, NSString s, я просто хочу увидеть строковые значения, а не сложные вложенные объекты.То же самое касается NSSet s, NSArrays и байтов внутри NSDataNSString s, хотя обычно получают их строковое представление в столбце «Сводка», на них невозможно смотреть, когда они длинные (например, имя пути, которое слишком длинно, чтобы поместиться в столбце, кажется, не прокручивается) - когда ядважды щелкните по нему, вместо этого я получаю строку шаблона дисплея, поэтому я не могу выбрать или скопировать ее.

Я недавно провел время в отладке Eclipse Java, и, несмотря на все его ошибки, Eclipse знает обо всех.коллекции Java, и имеет простой однострочный дамп из содержимого строки или коллекции или чего-либо еще, когда вы найдете это в отладчике.

Есть ли способ получить это в Xcode?Я упускаю что-то очевидное или мне нужно погрузиться в систему шаблонов дисплея?Я знаю, что там есть некоторая поддержка, поскольку NSArrays, похоже, получают специальный вид листового формата, NSDictionaries получают сводку «2 пары ключ / значение» и т. Д.

РЕДАКТИРОВАТЬ: можно зайти в GDB, чтобы получить большеданные об объектах.Я разочарован тем, что po GDB, действующий на NSDictionary, дает очень полезный вывод, который я ожидаю от отладчика GUI.Можно ли это реплицировать без переключения контекста на консоль?

Мне так нравится среда Xcode, но почти полная непрозрачность объектов, которые я использую все время, действительно блокирует время отладки.Спасибо.

Ответы [ 3 ]

4 голосов
/ 14 июля 2010

Я бы посмотрел как на специальный вывод GDB (как заметил Гобра), так и на шаблоны отображения.

Экран выглядит сложным, но на самом деле довольно прост - вот пример для makign NSIndexPath display " Sec: x Row: y ":

Sec:{(int)[$VAR section]}  Row:{(int)[$VAR row]} 

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

Еще одна хитрость, на которую следует обратить внимание, это то, что для всего, что возвращает строку, вам нужно добавить «: s» после пары «{}», например:

{[myClass description]}:s

Если вам нужно очистить шаблон дисплея, просто нажмите на строку, чтобы отредактировать и стереть все это - вы вернетесь к настройкам по умолчанию. Таким образом, очень легко быстро создать временные средства форматирования для любого объекта, которые позволят вам точно увидеть, что вас интересует.

4 голосов
/ 14 июля 2010

Да, поиск переменных XCode во время отладки слабый, но он основан на gdb, и вы можете управлять им с помощью консоли. Во время отладки откройте консоль и напишите любую нужную вам команду, чтобы увидеть NSDictionary * dic; содержание это так просто, как

po dic

po печатает данные, представленные в результате [obj description]. Вы также можете вызывать любые методы, такие как

po [dict valueForKey:@"myKey"], or p(NSRect) [[self view] frame]

Вы можете получить больше в справке GDB

1 голос
/ 02 сентября 2015

В Xcode 6 эта функция, кажется, была реализована? Я не могу говорить об особенностях XCode, когда этот вопрос был задан в 2010 году.

NSString, NSNumber, NSArray и NSDictionary значений в вашем коде с точкой останова:

variables in code

Когда прерывается точка останова, вы можете увидеть значения в Xcode «Просмотр переменных». Для коллекций вам может понадобиться развернуть стрелку сведений:

values in the debugger

Если щелкнуть правой кнопкой мыши переменную и выбрать "Print Description of variable_name", значение -debugDescription / -description объекта будет выведено на консоль. Это часто полезно для более сложных коллекций и, возможно, для длинных значений NSString и т. Д.

Screen shot in Xcode 7 of “Print Description” context-menu item

printed to the console.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...