如何转储存储在objective-c对象(NSArray或NSDictionary)中的数据
请原谅我这里一个潜在的愚蠢的问题,但在其他编程语言(脚本如PHP或Perl),通常很容易转储一个variables中包含的一切。
例如,在PHP中有var_dump()
或print_r()
函数。 Perl有Data::Dumper
CPAN类等等
Objective-C有没有这样的东西? 在less数情况下能够非常方便地转储所有类似的内容,而不是使用gdb来检查每个variables。
在Cocoa中,没有像PHP的print_r或python的repr那样的“转储”,因为没有像这些语言那样“表示”对象的文本格式。 如果你使用
NSLog(@"%@", myObj);
要么
NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];
要么
NSString *stringRep = [myObj description];
你会得到(在第一种情况下logging到控制台), [myObj description]
的结果,这是NSObject
定义的一个方法,用于打印对象的描述 ( 不是转储)。
如果你在gdb中调用了po myObj
,你会得到[myObj debugDescription]
(通常与description
相同,但并不总是)。
像NSArray
和NSDictionary
和NSData
覆盖description
打印一个非常有用的recursion描述其内容,但默认的[NSObject description]
只打印对应于实例的指针值。
如果您控制相关types的代码,则可以覆盖它们的description
或debugDescription
方法以返回任何您想要的内容。 如果没有,可以使用类别覆盖description
或debugDescription
方法,或使用类别定义myDebugDescription
或者使用po [myObj myDebugDescription]
从gdb调用。
您也可以使用gdb print object命令快速查看debugging器中的对象:
po dictionary
这将与您的代码中调用NSLog(…)基本相同。
当打印出包含ASCII数据的NSData时也是有用的:
p (char *) [data bytes]
使用NSLog()来转储对象的内容。 例如:
NSData* myData = //... assume this exists NSLog(@"Contents of myData: %@", myData);
NSLog有一个printf样式的格式string(需要一个NSString对象),后跟一个可变的参数列表,就像printf一样。 replace字符%@表示对象的描述方法。 这对于倾销Cocoa中的大多数Objective-C对象很有用。
如果你想转储一个对象的内容使用gdb(我看你用gdb标记了这个),使用特殊的“po”指令,而不是打印。 例如:
gdb) po myData
会导致gdb转储myData对象。 po是打印对象的快捷方式。
小心NSLoglogging – >你很可能不希望它在生产代码。
当您的产品在debugging模式下运行时,您可能需要使用另一个日志loggingfunction来调用NSLog。
我通常与此去“debugging”NSArray的内容:
NSEnumerator *arrenum = [myarray objectEnumerator]; id cobj; while ( cobj = [arrenum nextObject] ) { NSLog(@"%@", cobj); }
代码将枚举NSArray myarray
中的所有对象,然后遍历并打印每个对象。
希望这可以对某人有用!