如何记录数据和从void指针输入?

时间:2010-01-12 17:26:42

标签: objective-c chipmunk

我有以下代码:

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调用的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

%@格式说明符被解释为

  

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

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

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