Как сделать дамп данных, хранящихся в объекте target-c (NSArray или NSDictionary)
Простите меня за потенциально глупый вопрос здесь, но в других языках программирования (таких как PHP или Perl) часто легко выгружать все содержимое переменной.
Например, в PHP есть var_dump()
или же print_r()
функции. Perl имеет Data::Dumper
Класс CPAN и т. Д.
Есть ли что-то подобное для Objective-C? В некоторых случаях было бы очень удобно иметь возможность выводить все подобное вместо использования gdb для проверки каждой переменной.
5 ответов
В Какао нет "дампа", как в PHP print_r или pyrr repr, поскольку нет текстового формата, который "представляет" объект, как в этих языках. Если вы используете
NSLog(@"%@", myObj);
или же
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];
или же
NSString *stringRep = [myObj description];
вы получите (вошли в консоль в первом случае), результат [myObj description]
метод, определенный в NSObject
с целью печати описания (не дампа) объекта.
Если вы вызываете po myObj
в GDB вы получаете [myObj debugDescription]
(часто так же, как description
, но не всегда).
Классы как NSArray
а также NSDictionary
а также NSData
переопределение description
распечатать довольно полезное рекурсивное описание их содержимого, но по умолчанию [NSObject description]
печатает только значение указателя, соответствующее экземпляру.
Если вы управляете кодом для рассматриваемых типов, вы можете переопределить их description
или же debugDescription
методы, чтобы вернуть все, что вы хотите. Если нет, вы можете переопределить description
или же debugDescription
метод с использованием категории, или использовать категорию, чтобы определить myDebugDescription
или что-то такое, что вы могли бы затем вызвать из GDB с помощью po [myObj myDebugDescription]
,
Вы также можете использовать команду gdb print object для быстрого просмотра объекта в отладчике:
po dictionary
По сути это будет то же самое, что вызов NSLog(...) из вашего кода.
Также полезно при печати NSData, который содержит данные ASCII:
p (char *) [data bytes]
Используйте NSLog(), чтобы вывести содержимое объектов. Например:
NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);
NSLog имеет строку формата в стиле printf (ожидает объект NSString), за которой следует список переменных параметров, как и printf. Символ замены% @ представляет объект методом описания объекта. Это полезно для сброса большинства объектов Objective C в Какао.
Если вы хотите сбросить содержимое объекта с помощью gdb (я вижу, вы пометили это как gdb), используйте специальную директиву po вместо print. Например:
gdb) po myData
заставит GDB сбросить объект myData. po - это ярлык для print-объекта.
Будьте осторожны с журналированием NSLog -> вы, скорее всего, не хотите его использовать в рабочем коде.
Возможно, вы захотите использовать альтернативную функцию ведения журнала, которая вызывает NSLog, когда ваш продукт работает в режиме отладки.
Я обычно иду с этим, чтобы "отладить" содержимое NSArray:
NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;
while ( cobj = [arrenum nextObject] ) {
NSLog(@"%@", cobj);
}
Код будет перечислять все объекты в NSArray myarray
, а затем перебрать и распечатать каждый объект.
Надеюсь, что это может быть полезно для кого-то!