48

请原谅我在这里提出一个可能很愚蠢的问题,但在其他编程语言(如 PHP 或 Perl 之类的脚本语言)中,通常很容易转储变量中包含的所有内容。

例如,在 PHP 中有var_dump()orprint_r()函数。Perl 有Data::DumperCPAN 类等。

Objective-C 有类似的东西吗?在某些情况下,能够像这样转储所有内容会非常方便,而不是使用 gdb 检查每个变量。

4

5 回答 5

74

在 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,但并非总是如此)。

NSArrayNSDictionary覆盖打印一个非常有用的对其内容的递归描述,但默认NSData只打印与实例对应的指针值。description[NSObject description]

如果您控制相关类型的代码,则可以覆盖它们的descriptiondebugDescription方法以返回您想要的任何内容。如果没有,您可以使用类别覆盖descriptionordebugDescription方法,或使用类别来定义 amyDebugDescription或 some 这样您就可以从 gdb 使用po [myObj myDebugDescription].

于 2008-11-14T04:57:20.630 回答
17

您还可以使用 gdb print object 命令在调试器中快速查看对象:

po dictionary

这与在代码中调用 NSLog(...) 基本相同。

在打印出包含 ASCII 数据的 NSData 时也很有用:

p (char *) [data bytes]
于 2008-11-14T05:08:34.460 回答
10

使用 NSLog() 转储对象的内容。例如:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);

NSLog 有一个 printf 样式的格式字符串(需要一个 NSString 对象),后跟一个可变参数列表,就像 printf 一样。替换字符 %@ 表示对象的描述方法。这对于在 Cocoa 中转储大多数 Objective-C 对象很有用。

如果你想使用 gdb 转储对象的内容(我看到你用 gdb 标记了它),使用特殊的“po”指令而不是 print。例如:

gdb) po myData

将导致 gdb 转储 myData 对象。po 是打印对象的快捷方式。

于 2008-11-14T04:29:19.470 回答
4

小心 NSLog 日志记录->您很可能不希望它在生产代码中。

当您的产品在调试模式下运行时,您可能希望使用调用 NSLog 的备用日志记录函数。

于 2008-11-14T07:14:26.687 回答
3

我通常用它来“调试” NSArray 内容:

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

该代码将枚举 NSArray 中的所有对象myarray,然后遍历并打印每个对象。

希望这对某人有用!

于 2012-03-13T23:09:44.013 回答