繁体   English   中英

如何转储存储在objective-c对象中的数据(NSArray或NSDictionary)

[英]How to dump data stored in objective-c object (NSArray or NSDictionary)

请原谅我这里可能有些愚蠢的问题,但在其他编程语言(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中为了打印对象的描述而不是转储)而定义的方法。

如果在gdb中调用po myObj ,则会得到[myObj debugDescription] (通常与description相同,但并非总是如此)。

NSArrayNSDictionaryNSData这样的类重写description以打印其内容的非常有用的递归描述,但是默认[NSObject description]仅打印对应于该实例的指针值。

如果您控制相关类型的代码,则可以覆盖其descriptiondebugDescription方法以返回所需的任何内容。 如果没有,您可以使用类别覆盖descriptiondebugDescription方法,或使用类别来定义myDebugDescription或某些类,然后您可以使用po [myObj myDebugDescription]从gdb调用。

您还可以使用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的快捷方式。

注意NSLog日志记录 - >您很可能不希望它出现在生产代码中。

当产品在调试模式下运行时,您可能希望使用调用NSLog的备用日志记录功能。

我通常使用它来“调试”NSArray内容:

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}

代码将枚举NSArray myarray中的所有对象,然后遍历并打印每个对象。

希望这对某人有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM