[英]How do I create an Objective-C NSDictionary of NSArrays without reusing the same NSArray?
[英]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
相同,但并非总是如此)。
像NSArray
和NSDictionary
和NSData
这样的类重写description
以打印其内容的非常有用的递归描述,但是默认[NSObject description]
仅打印对应于该实例的指针值。
如果您控制相关类型的代码,则可以覆盖其description
或debugDescription
方法以返回所需的任何内容。 如果没有,您可以使用类别覆盖description
或debugDescription
方法,或使用类别来定义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.