Objective c EXC_在Obj-C中简单地投射指针时访问错误

Objective c EXC_在Obj-C中简单地投射指针时访问错误,objective-c,xcode,memory-management,Objective C,Xcode,Memory Management,常客,但在StackOverflow上的第一篇帖子,我希望你们能帮我解决这个问题。我是Obj-C和XCode的新手,我面临着这个问题,真的。。。奇怪的问题谷歌没有发现任何东西。基本上,我在一条线路上得到一个EXC_BAD_访问信号,它不做任何解引用或我能看到的任何类似的事情。想知道你们是否知道在哪里可以找到这个。我找到了一个工作,但不知道为什么会这样。。。断开版本的条形码所在的行是: LevelEntity *le = entity; 在那里我得到了坏的进入信号 下面是: 此版本有效 此版本不

常客,但在StackOverflow上的第一篇帖子,我希望你们能帮我解决这个问题。我是Obj-C和XCode的新手,我面临着这个问题,真的。。。奇怪的问题谷歌没有发现任何东西。基本上,我在一条线路上得到一个EXC_BAD_访问信号,它不做任何解引用或我能看到的任何类似的事情。想知道你们是否知道在哪里可以找到这个。我找到了一个工作,但不知道为什么会这样。。。断开版本的条形码所在的行是:

LevelEntity *le = entity;
在那里我得到了坏的进入信号

下面是:

此版本有效

此版本不起作用

NSArray*contacts=[self.body getContacts];
对于(i=0;i<[联系人计数];i++)
{
PhysicContact*contact=[contacts objectAtIndex:i];
物理身体*其他身体;
if(contact.bodyA==self.body)
{
otherBody=contact.bodyB;
}
if(contact.bodyB==self.body)
{
otherBody=contact.bodyA;
}
id实体=[otherBody userData];
如果(实体!=nil)
{
LevelEntity*le=实体;
CGPoint point=[contact contactPointOnBody:otherBody];
}
}
在这里,这两个示例之间的唯一区别是我枚举数组的方式。在第一个版本(有效)中,我使用for(…In…),在第二个版本中,我使用for(…;…;…)。据我所知,这些应该是一样的

这让我很奇怪。有没有人有过类似的经历或想法这里发生了什么?太好了:)

干杯,
Alex

首先,如果您发生崩溃,您有一个回溯跟踪。始终为您的问题提供回溯(它将在调试器中,并且可以复制/粘贴)

正如Vojito所暗示的,此类崩溃的最常见原因与过度释放对象有关

在您的例子中,
for(;;)
for(…In…
实际上并不完全相同。后者很可能导致数组中的对象在迭代期间被保留,或者在检索时自动删除(我说“很可能”,因为我没有测试它——但它可以解释这种行为)

在代码中,您在迭代过程中使用诸如
otherBody=contact.bodyB
之类的语句修改对象图。如果这些语句中的任何一个碰巧导致被迭代的数组中的一个项从数组下释放,您将看到崩溃。类似地,如果修改对象图导致
contact.bodyA
contact.bodyB
成为悬挂引用,您将看到崩溃


这只是一个有根据的猜测。发布回溯,并按照Vojito的建议,在启用僵尸检测的工具中的分配工具下运行。

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

PhysicsBody *otherBody = nil;

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

虽然他确实应该将otherBody初始化为nil,但他在有效的和无效的两种情况下都不存在,这意味着(不知何故)似乎不会导致崩溃,除非NSFastEnumeration不支持堆栈(我不相信它会)说得好,谢谢。正如Jared P所说,我不认为这是导致崩溃的原因,尽管正如你所说的,一般来说,这是良好的做法。谢谢:)由于涉及NSFastEnumeration,这意味着这两个示例的堆栈完全不同。因此,在一个实例中,另一个主体(由于调用语义)可能永远不会是垃圾,实际上以nil值开始@AlexChilcott,你试过我的建议了吗?从你的评论来看,你似乎没有调查过这是否解决了问题(或接受答案的建议)。嗨,杰森。感谢您的建议:)我确实做了您答案中建议的更改,以防其他主体的赋值都未命中(这不应该是事实,因为我的代码中的其他地方包含了断言)。然而,它并没有解决我的问题。我接受了bbum的回答,因为它给出了一个合理的解释(我还不能排除),解释了为什么我看到了我现在的行为。我还没有弄清楚到底发生了什么,所以我不能确定到底发生了什么,但是bbum的回答是最有启发性的。不,所有的逻辑都在同一条线上。这真的是一个非常简单的应用程序,只是让我开始使用Obj C和iPhone;您是在使用从代码示例中删除的点进行操作,还是该调用实际上设置了一些接触或其他主体的状态?我现在正在使用它进行操作-我在编写示例时没有这样做,因为我发现在编写引用的行和实际使用值之间存在冲突:)嗯,谢谢,这听起来很有可能。看来我还有很多关于内存管理的知识要学!我有着C#的背景,所以我习惯了所有这些东西都是免费的。这很有趣,但很辛苦!
  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];
   }
  }
PhysicsBody *otherBody = nil;