Как сделать дамп данных, хранящихся в объекте target-c (NSArray или NSDictionary) - PullRequest
45 голосов
/ 14 ноября 2008

Простите за потенциально глупый вопрос здесь, но в других языках программирования (таких как PHP или Perl) часто легко выгрузить все, что содержится в переменной.

Например, в PHP есть функции var_dump() или print_r(). Perl имеет класс Data::Dumper CPAN и т. Д. И т. Д.

Есть ли что-то подобное для Objective-C? В некоторых случаях было бы очень удобно иметь возможность выводить все подобные данные вместо использования gdb для проверки каждой переменной.

Ответы [ 5 ]

71 голосов
/ 14 ноября 2008

В Какао нет «дампа», как в PHP print_r или в Python 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].

16 голосов
/ 14 ноября 2008

вы также можете использовать команду gdb print object для быстрого просмотра объекта в отладчике:

po dictionary

Это будет в основном то же самое, что вызов NSLog (...) из вашего кода.

Также полезно при печати NSData, который содержит данные ASCII:

p (char *) [data bytes]
10 голосов
/ 14 ноября 2008

Используйте 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-объекта.

4 голосов
/ 14 ноября 2008

Будьте осторожны с журналированием NSLog -> вы, скорее всего, не захотите его в рабочем коде.

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

3 голосов
/ 14 марта 2012

Обычно я делаю это для "отладки" содержимого NSArray:

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}

Код перечислит все объекты в NSArray myarray, а затем перебирает и печатает каждый объект.

Надеюсь, это кому-нибудь пригодится!

...