请原谅我在这里提出了一个可能很愚蠢的问题,但在其他编程语言( PHP或Perl等脚本语言)中,通常很容易转储变量中包含的所有内容。
例如,在PHP中有var_dump()
或print_r()
函数。Perl有Data::Dumper
CPAN类,等等。
Objective-C有类似的东西吗?在少数情况下,能够像那样转储所有内容,而不是使用gdb检查每个变量,这将非常方便。
发布于 2008-11-14 04:57:21
在Cocoa中,没有像PHP语言的print_r或python的repr那样的“转储”,因为在这些语言中没有“表示”对象的文本格式。如果您使用
NSLog(@"%@", myObj);
或
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];
或
NSString *stringRep = [myObj description];
您将得到(在第一种情况下记录到控制台) [myObj description]
的结果,这是一个在NSObject
中定义的方法,用于打印对象的描述(not a dump)。
如果在gdb中调用po myObj
,则会得到[myObj debugDescription]
(通常与description
相同,但也不总是相同)。
像NSArray
、NSDictionary
和NSData
这样的类覆盖description
来打印其内容的非常有用的递归描述,但是默认的[NSObject description]
只打印对应于实例的指针值。
如果您控制有问题的类型的代码,则可以覆盖它们的description
或debugDescription
方法以返回所需的任何内容。如果没有,您可以使用category覆盖description
或debugDescription
方法,或者使用category定义一个myDebugDescription
或类似的东西,然后可以使用po [myObj myDebugDescription]
从gdb调用。
发布于 2008-11-14 05:08:34
您还可以使用gdb print object命令在调试器中快速查看对象:
po dictionary
这基本上等同于调用NSLog(...)在你的代码中。
当打印出包含ASCII码数据的NSData时也很有用:
p (char *) [data bytes]
发布于 2008-11-14 04:29:19
使用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的快捷方式。
https://stackoverflow.com/questions/289241
复制相似问题