如何转储存储在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相同,但并不总是)。

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

如果您控制相关types的代码,则可以覆盖它们的descriptiondebugDescription方法以返回任何您想要的内容。 如果没有,可以使用类别覆盖descriptiondebugDescription方法,或使用类别定义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中的所有对象,然后遍历并打印每个对象。

希望这可以对某人有用!