EXC_BAD_ACCESS SpriteKit场景转换,没有僵尸

时间:2015-09-03 16:27:50

标签: objective-c sprite-kit exc-bad-access skscene nszombie

我遇到了由EXC_BAD_ACCESS引起的崩溃。将NSZombieEnabled设置为YES不会捕获它,表明它不是一个释放的对象。 (男孩,我真的希望如此)

堆栈跟踪不太有用(对我而言)。有没有人看到它的任何见解?

bad address

stack trace

SpriteKit`std::__1::__tree_iterator<SKCSprite*, std::__1::__tree_node<SKCSprite*, void*>*, long> std::__1::__tree<SKCSprite*, std::__1::less<SKCSprite*>, std::__1::allocator<SKCSprite*> >::find<SKCSprite*>:
    0x1890c376c <+0>:  ldr    x9, [x0, #8]!
    0x1890c3770 <+4>:  cbz    x9, 0x1890c37b8           ; <+76>
    0x1890c3774 <+8>:  ldr    x10, [x1]
    0x1890c3778 <+12>: mov    x8, x0
->  0x1890c377c <+16>: ldr    x11, [x9, #32]
    0x1890c3780 <+20>: cmp    x11, x10
    0x1890c3784 <+24>: b.hs   0x1890c3794               ; <+40>
    0x1890c3788 <+28>: ldr    x9, [x9, #8]
    0x1890c378c <+32>: cbnz   x9, 0x1890c377c           ; <+16>
    0x1890c3790 <+36>: b      0x1890c37a0               ; <+52>
    0x1890c3794 <+40>: mov    x8, x9
    0x1890c3798 <+44>: ldr    x9, [x9]
    0x1890c379c <+48>: cbnz   x9, 0x1890c377c           ; <+16>
    0x1890c37a0 <+52>: cmp    x8, x0
    0x1890c37a4 <+56>: b.eq   0x1890c37b8               ; <+76>
    0x1890c37a8 <+60>: ldr    x9, [x1]
    0x1890c37ac <+64>: ldr    x10, [x8, #32]
    0x1890c37b0 <+68>: cmp    x9, x10
    0x1890c37b4 <+72>: b.hs   0x1890c37bc               ; <+80>
    0x1890c37b8 <+76>: mov    x8, x0
    0x1890c37bc <+80>: mov    x0, x8
    0x1890c37c0 <+84>: ret    

其他背景:

正在转换到新场景的SpriteKit应用程序。最初会显示新场景,但会立即发生崩溃。

传入和传出场景都有动作。这些操作包含引用场景的块。场景漏水,这个街区似乎是罪犯之一。当我添加代码来删除操作时,就会出现这种崩溃。

Xcode 6.4 iPad Air,iOS 8.4.1

修改1 : 此代码存在于每个SKScene上。 当第二种方法被注释掉时,隐藏问题(我相信通过帮助泄漏)。

- (void)startAutoScore {
  // as long as you survive, you gradually accumulate points
  SKAction *autoScore = [SKAction runBlock:^{
    [self adjustScoreBy:1];
  }];

  NSTimeInterval duration = 0.25;
  SKAction *slice = [SKAction sequence:@[[SKAction waitForDuration:duration], autoScore]];
  SKAction *repeat = [SKAction repeatAction:slice count:self.fieldDescriptor.duration / duration - 1];
  [self runAction:repeat withKey:@"autoScore"];
}

- (void)stopAutoScore {
//  [self removeActionForKey:@"autoScore"];
}

编辑2 :我已与仪器确认,当执行stopAutoScore方法时,将删除对使用过的SKScene的最后一个剩余引用,并且旧场景正确解除分配。

1 个答案:

答案 0 :(得分:0)

我有一个当前(不太理想)的解决方法

如果我将转换从特别复杂的SKScene转换为直的presentScene:

从:

SKTransition *transition = [SKTransition fadeWithColor:[SKColor whiteColor] duration:1.0];
[self.view presentScene:scene transition:transition];

为:

[self.view presentScene:scene];

如果我在之前明确删除了要替换的场景中的所有孩子,我会调用'presentScene'

[self removeAllChildren];

然后崩溃(这是非确定性的,但很常见,至少在第4次这样的转变中发生)停止。

考虑到这一点,我会认为这是SpriteKit内部的一个错误,或者某种方式我管理精灵错误。我很想得到正确答案。