objective-c - 无法解释的错误访问错误

标签 objective-c nsmutablearray exc-bad-access

我有一些代码可以迭代数组。我正在添加第二个可变数组,以便可以向其中添加对象,我希望在迭代完成后将其删除。然而,当我尝试将对象添加到我创建的第二个数组时,这会导致严重的访问错误。这让我很困惑,因为我尝试添加的对象可以用于所有类型的事物,只是不添加到这个数组中。这让我相信数组可能正在被释放,所以我保留了它,但这没有效果。这是代码:

    CCTMXObjectGroup *objectGroup = [ self objectGroupNamed: @"object" ];
    NSMutableArray *objectsToRemove = [ NSMutableArray array ];
    for ( NSDictionary *object in [ objectGroup objects ] ) {
        [ objectsToRemove addObject: object ]; // crash occurs here
        // name, type, x, y, width, height
        NSString *name = [ object valueForKey: @"name" ];
        if ( [ name isEqualToString: @"sprite" ] ) {
            [ self createSpriteFromObject: object ];
        } else if ( [ name isEqualToString: @"spriteController" ] ) {
            [ self createSpriteControllerFromObject: object ];
        }
    }

如果我删除 addObject 行,崩溃将不再发生。更糟糕的是,崩溃似乎只发生在第 6 次迭代中。单步执行代码,我添加到的可变数组以及我添加到其中的对象似乎都很好(未发布)。那么为什么会出现错误的访问错误呢?

编辑

CoreFoundation`-[__NSArrayM addObject:]:
0x23c39e0:  pushl  %ebp
0x23c39e1:  movl   %esp, %ebp
0x23c39e3:  pushl  %edi
0x23c39e4:  pushl  %esi
0x23c39e5:  subl   $16, %esp
0x23c39e8:  calll  0x23c39ed                 ; -[__NSArrayM addObject:] + 13
0x23c39ed:  popl   %edi
0x23c39ee:  movl   1512267(%edi), %eax
0x23c39f4:  movl   %eax, 4(%esp)
0x23c39f8:  movl   8(%ebp), %esi
0x23c39fb:  movl   %esi, (%esp)
0x23c39fe:  calll  0x24e35c8                 ; symbol stub for: objc_msgSend
0x23c3a03:  movl   1512287(%edi), %ecx
0x23c3a09:  movl   %eax, 12(%esp)
0x23c3a0d:  movl   16(%ebp), %eax
0x23c3a10:  movl   %eax, 8(%esp)
0x23c3a14:  movl   %ecx, 4(%esp)
0x23c3a18:  movl   %esi, (%esp)
0x23c3a1b:  calll  0x24e35c8                 ; symbol stub for: objc_msgSend
0x23c3a20:  addl   $16, %esp ; bad access code 2
0x23c3a23:  popl   %esi
0x23c3a24:  popl   %edi
0x23c3a25:  popl   %ebp
0x23c3a26:  ret    
0x23c3a27:  nopw   (%eax,%eax)

libsystem_sim_c.dylib`bzero$VARIANT$sse42:
0x1f9c200:  pushl  %ebp
0x1f9c201:  movl   %esp, %ebp
0x1f9c203:  pushl  %edi
0x1f9c204:  movl   8(%ebp), %edi
0x1f9c207:  movl   12(%ebp), %edx
0x1f9c20a:  xorl   %eax, %eax
0x1f9c20c:  cmpl   $80, %edx
0x1f9c20f:  jg     0x1f9c24c                 ; bzero$VARIANT$sse42 + 76
0x1f9c211:  cmpl   $12, %edx
0x1f9c214:  jge    0x1f9c226                 ; bzero$VARIANT$sse42 + 38
0x1f9c216:  testl  %edx, %edx
0x1f9c218:  je     0x1f9c246                 ; bzero$VARIANT$sse42 + 70
0x1f9c21a:  movb   %al, (%edi) ; bad access code 2
0x1f9c21c:  incl   %edi

最佳答案

NSMutableArray *objectsToRemove = [ NSMutableArray array ];
for ( NSDictionary *object in [ objectGroup objects ] ) {
    [ objectsToRemove addObject: object ]; // crash occurs here

如果崩溃发生在此处,那么它与 objectsToRemove 没有任何关系(除非有您未显示的代码)。

这意味着对象是bunko。很可能,它已从 objectGroup 下释放。打开僵尸检测并重新运行您的应用。

注意:当你是新手时,调试这些东西可能会令人畏惧。一些提示:

• 如果您盯着汇编代码,那么您几乎肯定已经陷入困境。

• 如果您在 Foundation 框架方法中崩溃,则几乎可以保证错误在其他地方,因为这些方法会执行数亿次来启动您的 Mac 或 iOS 设备。假设它们有效是一个安全的选择。

关于objective-c - 无法解释的错误访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306060/

相关文章:

ios - 使用扩展 CLPlacemark 的自定义类填充 NSMutableArray 后执行错误访问

ios - 如何防止我不知道的对象上的 EXC_BAD_ACCESS 在 iOS 9 中发布?

ios - 如何知道ios委托(delegate)是否被释放

objective-c - NSTextField 的单元格 setPlaceholderAttributedString - 获得焦点时占位符不可见

ios - uibuttontypedetaildisclosure 自定义图像

ios - 无法使用 setPitchEnabled 将其值更改为 YES

objective-c - 按钮setHidden在iOS 5中崩溃

iphone - 当成功 block 启动时,__block 弱崩溃

objective-c - 从 NSMutableArray 中提取 NSDictionary

objective-c - 将数组从一个 View 添加到另一个 View 并保留值