请原谅我这里可能有些愚蠢的问题,但在其他编程语言(PHP或Perl等脚本编写语言)中,通常很容易转储变量中包含的所有内容.
例如,在PHP中有var_dump()
或print_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
or debugDescription
方法,或使用类别来定义一个myDebugDescription
或多个类别,然后您可以使用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是print-object的快捷方式.