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

Iphone 如何转储存储在objective-c对象(NSArray或NSDictionary)中的数据,iphone,objective-c,gdb,dump,Iphone,Objective C,Gdb,Dump,请原谅我这里有一个潜在的愚蠢问题,但在其他编程语言(如PHP或Perl脚本语言)中,转储变量中包含的所有内容通常都很容易 例如,在PHP中有var\u dump()或print\u r()函数。Perl有Data::DumperCPAN类等 对于Objective-C有类似的东西吗?在某些情况下,可以像这样转储所有内容,而不是使用gdb检查每个变量,这将非常方便。使用NSLog()转储对象的内容。例如: NSData* myData = //... assume this exists NSLo

请原谅我这里有一个潜在的愚蠢问题,但在其他编程语言(如PHP或Perl脚本语言)中,转储变量中包含的所有内容通常都很容易

例如,在PHP中有
var\u dump()
print\u r()
函数。Perl有
Data::Dumper
CPAN类等

对于Objective-C有类似的东西吗?在某些情况下,可以像这样转储所有内容,而不是使用gdb检查每个变量,这将非常方便。

使用NSLog()转储对象的内容。例如:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);
gdb) po myData
NSLog有一个printf样式的格式字符串(需要一个NSString对象),后跟一个变量参数列表,就像printf一样。替换字符%@表示对象的描述方法。这对于在Cocoa中转储大多数Objective-C对象非常有用

如果您想使用gdb转储对象的内容(我看到您用gdb标记了它),请使用特殊的“po”指令而不是print。例如:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);
gdb) po myData
将导致gdb转储myData对象。po是打印对象的快捷方式。

在Cocoa中,没有像PHP的print\r或python的repr那样的“转储”,因为没有像这些语言那样“表示”对象的文本格式。如果你使用

NSLog(@"%@", myObj);

您将获得(在第一种情况下记录到控制台)
[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日志->您很可能不希望它出现在生产代码中

当您的产品在调试模式下运行时,您可能需要使用另一个调用NSLog的日志记录函数。

我通常使用此函数来“调试”NSArray内容:

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}
代码将枚举NSArray
myarray
中的所有对象,然后遍历并打印每个对象


希望这对别人有用

字符串格式表示(由NSLog和[NSString stringWithFormat:]等使用)可能不是对象的完整“转储”。它是对象描述方法的结果。由于对象可以覆盖此描述,您可能会因其使用而改变结果。我知道,这就是为什么我说“这对于在Cocoa中转储/most/Objective-C对象很有用”,但这基本上是OP所要求的。这是一个很好的观点。我知道很多新的Objective C程序员没有意识到这一点。如果您认为NSLog是ObjC的printf或std::cout,那么就不应该犯太大的错误(编写DLog包装器宏很简单)。您可以随心所欲地使用NSLog。您所要做的就是在.pch文件中添加这些行,以便神奇地从发行版中删除所有NSLog行:
#ifndef DEBUG
#define NSLog(…)
#endif
。。。
description
方法正是我需要的!谢谢你提供的信息!:)总是得到这样的消息:这只打印前几百个字节。如何使其打印所有这些内容?请参见Handy:
[myview recursiveDescription]