我有以下代码:
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调用的最佳方法是什么?
答案 0 :(得分:2)
我认为您的问题是%@
仅在shape->data
真正指向Objective-C对象时才有意义,因为使用它会触发-description
向obj
的发送。
但是,如果例如shape->data
指向int
,则消息将发送到不存在的对象。相反,某些内存位置可能会被解释为对象的原始字节,从而导致运行时崩溃。
回答你的问题:void指针的类型是void *
,指针的目标类型是void
。您可以使用%p
打印指针的值,但我怀疑这是您想要的。
因此,如果您确定shape->data
指向的内存位置代表Objective-C对象,并且您可以访问类代码,则可以覆盖-description
以打印您喜欢的任何信息
答案 1 :(得分:1)
%@
格式说明符被解释为
Objective-C对象,打印为
descriptionWithLocale:
返回的字符串(如果可用),否则打印为description
。也适用于CFTypeRef
个对象,返回CFCopyDescription
函数的结果。
基本上,如果ptr
没有指向Objective-C对象,那你就不走运了!
无论哪种方式,你都应该将void *
指针强制转换为有意义的东西..