简单地在Obj-C中转换指针时EXC_BAD_ACCESS

时间:2010-05-15 12:10:06

标签: objective-c xcode memory-management

频繁访问者,但首先在StackOverflow上发帖,我希望你们能够帮助我解决这个问题。我是Obj-C和XCode的新手,我真的面对这个......很奇怪......问题。谷歌搜索没有发现任何东西。基本上,我在没有进行任何解除引用的行上得到一个EXC_BAD_ACCESS信号或者我可以看到的任何东西。想知道你们是否知道在哪里寻找这个。我找到了一个解决方法,但不知道为什么这个有用......破坏版本barfs的行就是这一行:

LevelEntity *le = entity;

我得到了糟糕的访问信号。

这里是:

此版本

  NSArray *contacts = [self.body getContacts];
  for (PhysicsContact *contact in contacts)
  {
   PhysicsBody *otherBody;
   if (contact.bodyA == self.body)
   {
    otherBody = contact.bodyB;
   }
   if (contact.bodyB == self.body)
   {
    otherBody = contact.bodyA;
   }

   id entity = [otherBody userData];
   if (entity != nil)
   {
    LevelEntity *le = entity;

    CGPoint point = [contact contactPointOnBody:otherBody];
   }
  }

此版本无法正常工作

  NSArray *contacts = [self.body getContacts];
  for (NSUInteger i = 0; i < [contacts count]; i++)
  {
   PhysicsContact *contact = [contacts objectAtIndex:i];
   PhysicsBody *otherBody;
   if (contact.bodyA == self.body)
   {
    otherBody = contact.bodyB;
   }
   if (contact.bodyB == self.body)
   {
    otherBody = contact.bodyA;
   }

   id entity = [otherBody userData];
   if (entity != nil)
   {
    LevelEntity *le = entity;

    CGPoint point = [contact contactPointOnBody:otherBody];
   }
  }

这里,两个示例之间的唯一区别是我通过我的数组枚举的方式。在第一个版本(有效)我​​用于(... in ...),在第二个版本中,我用于(...; ...; ...)。据我所见,这些应该是一样的。

这是非常让我失望的。任何人都有类似的经历或想法在这里发生什么?真的很棒:)。

干杯, 亚历

2 个答案:

答案 0 :(得分:3)

首先,如果你遇到了崩溃,你就有了回溯。始终为您的问题提供回溯(它将在调试器中,并且可以复制/粘贴)。

正如Vojito暗示的那样,这类崩溃的最常见原因与物体的过度释放有关。

在您的情况下,for(;;)for(... in ...)实际上并不完全相同。后者很可能导致数组中的对象在迭代期间保留或在检索时自动释放(我说“非常可能”因为我没有测试它 - 但它会解释行为)。

在您的代码中,您在迭代期间使用otherBody = contact.bodyB之类的语句修改对象图。如果这些语句中的任何一个恰好导致迭代的数组中的一个项被从数组下面释放出来,那么你会看到崩溃。同样,如果对象图的修改导致contact.bodyAcontact.bodyB成为悬空参考,您会看到崩溃。

所有这些只是一个有根据的猜测。发布回溯,正如Vojito建议的那样,在启用了僵尸检测的仪器中的分配工具下运行。

答案 1 :(得分:1)

堆栈变量(包括对象引用)不会自动初始化为nil / 0 / NULL。尝试在初始化程序中将otherBody设置为nil:

PhysicsBody *otherBody = nil;

如果调试器说le赋值是发生异常的地方,它实际上可能是它上面的语句,即[otherBody userData]。在没有初始化的情况下,otherBody是垃圾值。