我遇到了由EXC_BAD_ACCESS
引起的崩溃。将NSZombieEnabled
设置为YES不会捕获它,表明它不是一个释放的对象。 (男孩,我真的希望如此)
堆栈跟踪不太有用(对我而言)。有没有人看到它的任何见解?
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
的最后一个剩余引用,并且旧场景正确解除分配。
答案 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内部的一个错误,或者某种方式我管理精灵错误。我很想得到正确答案。