Iphone 如何转储存储在objective-c对象(NSArray或NSDictionary)中的数据
请原谅我这里有一个潜在的愚蠢问题,但在其他编程语言(如PHP或Perl脚本语言)中,转储变量中包含的所有内容通常都很容易 例如,在PHP中有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
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);
}
代码将枚举NSArraymyarray
中的所有对象,然后遍历并打印每个对象
希望这对别人有用 字符串格式表示(由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]