【问题标题】:How to dump data stored in objective-c object (NSArray or NSDictionary)如何转储存储在objective-c对象(NSArray或NSDictionary)中的数据
【发布时间】:2008-11-14 04:24:29
【问题描述】:

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

例如,在 PHP 中有 var_dump()print_r() 函数。 Perl 有 Data::Dumper CPAN 类等。

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

【问题讨论】:

标签: iphone objective-c gdb dump


【解决方案1】:

在 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 调用的方法。

【讨论】:

  • description 方法正是我所需要的!谢谢你提供的详情! :)
  • 总是收到这样的消息:
【解决方案2】:

您也可以使用 gdb print object 命令在调试器中快速查看对象:

po dictionary

这与在代码中调用 NSLog(...) 基本相同。

在打印出包含 ASCII 数据的 NSData 时也很有用:

p (char *) [data bytes]

【讨论】:

  • 这只会打印前几百个字节。我怎样才能让它全部打印出来?
【解决方案3】:

使用 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 和 [NSString stringWithFormat:] 等人使用)可能不是对象的完整“转储”。它是对象的描述方法的结果。由于对象可以覆盖此描述,因此您可能会因使用它而产生不同的结果。
  • 我知道,这就是为什么我说“这对于在 Cocoa 中转储 /most/ Objective-C 对象很有用”,但这基本上是 OP 所要求的。
【解决方案4】:

小心使用 NSLog 日志记录 -> 您很可能不希望在生产代码中使用它。

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

【讨论】:

  • 这是一个很好的观点。我很多新的 Objective C 程序员都没有意识到这一点。如果您认为 NSLog 是 ObjC 的 printf 或 std::cout,那么您应该不会大错特错(并且编写 DLog 包装器宏是微不足道的)。
  • 你可以随心所欲地使用 NSLog。您所要做的就是在您的 .pch 文件中添加这些行,以神奇地从版本中删除所有 NSLog 行:#ifndef DEBUG#define NSLog(...)#endif...see here
【解决方案5】:

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

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

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

希望这对某人有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多