【问题标题】:How to log data & type from a void pointer?如何从 void 指针记录数据和类型?
【发布时间】:2010-01-12 17:26:42
【问题描述】:

我有以下代码:

eachShape(void *ptr, void* unused) {
  cpShape *shape = (cpShape *) ptr;
  id obj = shape->data;
  NSLog(@"shape->data: %@", obj);  // this is where EXC_BAD_ACCESS can occur
  ...

你们中的一些人可能会从 iPhone 开发中使用的 Chipmunk 物理框架中认出它。基本上我在这里崩溃是因为我在其他代码中关于 cpSpace 所做的事情,但我想弄清楚这里发送了什么对象类型并导致我的 NSLog 语句崩溃(并造成其他破坏)。

将类型和/或内容从 void 指针转储到 NSLog 调用的最佳方法是什么?

【问题讨论】:

  • 在通过 void* 的对象中发现问题。他们的属性修饰符在应该保留时设置为分配。因此,当我们到达 NSLog 代码时,指针的引用已经消失/无效。

标签: objective-c chipmunk


【解决方案1】:

我认为你的问题是%@ 只有在shape->data 真正指向一个Objective-C 对象时才有意义,因为使用它会触发-descriptionobj 的发送。 但是如果例如shape->data 指向int,则消息将被发送到一个并不真正存在的对象。相反,某些内存位置可能会被解释为对象的原始字节,从而导致运行时崩溃。

回答你的问题:空指针的类型是void *,指针的目标类型是void。您可以使用%p 打印指针的值,但我怀疑这是您想要的。

因此,如果您确定shape->data 指向的内存位置代表一个Objective-C 对象,并且您可以访问类代码,则可以覆盖-description 以打印您喜欢的任何信息。

【讨论】:

    【解决方案2】:

    %@ 格式说明符被解释为

    Objective-C 对象,如果可用,则打印为descriptionWithLocale: 返回的字符串,否则打印为description。也适用于CFTypeRef 对象,返回CFCopyDescription 函数的结果。

    基本上,如果ptr 没有指向一个Objective-C 对象,那么你就不走运了!

    无论哪种方式,您都应该将 void * 指针转换为有意义的东西..

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 2016-11-23
      • 2013-05-14
      • 2021-02-28
      • 2011-02-05
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多