Как сбрасывать данные, хранящиеся в объекте objective-c (NSArray или NSDictionary)
Простите меня за потенциально глупый вопрос здесь, но на других языках программирования (например, на скриптах, таких как PHP или Perl) часто легко сбрасывать все, что содержится в переменной.
Например, в PHP есть функции var_dump()
или print_r()
. Perl имеет класс Data::Dumper
CPAN и т.д. И т.д.
Есть ли что-то вроде этого для Objective-C? В некоторых случаях было бы очень удобно сбрасывать все, что угодно, вместо того, чтобы использовать gdb для проверки каждой переменной.
Ответы
Ответ 1
В Cocoa нет "дампа", такого как 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]
.
Ответ 2
вы также можете использовать команду gdb print object для быстрого просмотра объекта в отладчике:
po dictionary
Это будет в основном таким же, как вызов NSLog (...) из вашего кода.
Также полезно при печати NSData, содержащей данные ASCII:
p (char *) [data bytes]
Ответ 3
Используйте NSLog() для сброса содержимого объектов. Например:
NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);
NSLog имеет строку формата стиля printf (ожидает объект NSString), за которым следует список переменных, как и printf. Заменяющий символ% @представляет объект методом описания объекта. Это полезно для сброса большинства объектов Objective-C в Cocoa.
Если вы хотите сбросить содержимое объекта с помощью gdb (я вижу, что вы отметили его с помощью gdb), используйте специальную директиву "po" вместо печати. Например:
gdb) po myData
заставит gdb сбрасывать объект myData. po - это ярлык для объекта print.
Ответ 4
Будьте осторожны с протоколом NSLog → вы, скорее всего, не хотите его в производственном коде.
Возможно, вы захотите использовать альтернативную функцию ведения журнала, которая вызывает NSLog, когда ваш продукт работает в режиме отладки.
Ответ 5
Обычно я использую это для "отладки" содержимого NSArray:
NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;
while ( cobj = [arrenum nextObject] ) {
NSLog(@"%@", cobj);
}
Код будет перечислять все объекты в NSArray myarray
, а затем перебирать и печатать каждый объект.
Надеюсь, это может быть полезно для кого-то!