请原谅我在这里提出一个可能很愚蠢的问题,但在其他编程语言(如 PHP 或 Perl 之类的脚本语言)中,通常很容易转储变量中包含的所有内容。
例如,在 PHP 中有var_dump()
orprint_r()
函数。Perl 有Data::Dumper
CPAN 类等。
Objective-C 有类似的东西吗?在某些情况下,能够像这样转储所有内容会非常方便,而不是使用 gdb 检查每个变量。
请原谅我在这里提出一个可能很愚蠢的问题,但在其他编程语言(如 PHP 或 Perl 之类的脚本语言)中,通常很容易转储变量中包含的所有内容。
例如,在 PHP 中有var_dump()
orprint_r()
函数。Perl 有Data::Dumper
CPAN 类等。
Objective-C 有类似的东西吗?在某些情况下,能够像这样转储所有内容会非常方便,而不是使用 gdb 检查每个变量。
在 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
ordebugDescription
方法,或使用类别来定义 amyDebugDescription
或 some 这样您就可以从 gdb 使用po [myObj myDebugDescription]
.
您还可以使用 gdb print object 命令在调试器中快速查看对象:
po dictionary
这与在代码中调用 NSLog(...) 基本相同。
在打印出包含 ASCII 数据的 NSData 时也很有用:
p (char *) [data bytes]
使用 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 是打印对象的快捷方式。
小心 NSLog 日志记录->您很可能不希望它在生产代码中。
当您的产品在调试模式下运行时,您可能希望使用调用 NSLog 的备用日志记录函数。
我通常用它来“调试” NSArray 内容:
NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;
while ( cobj = [arrenum nextObject] ) {
NSLog(@"%@", cobj);
}
该代码将枚举 NSArray 中的所有对象myarray
,然后遍历并打印每个对象。
希望这对某人有用!