Как сбрасывать данные, хранящиеся в объекте objective-c (NSArray или NSDictionary) - программирование
Подтвердить что ты не робот

Как сбрасывать данные, хранящиеся в объекте objective-c (NSArray или NSDictionary)

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

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

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

4b9b3361

Ответ 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, а затем перебирать и печатать каждый объект.

Надеюсь, это может быть полезно для кого-то!