升级到iOS8 SpriteKit游戏后EXC_BAD_ACCESS

时间:2014-09-30 10:50:39

标签: objective-c xcode sprite-kit ios8 exc-bad-access

升级到iOS8后,SpriteKit游戏因EXC_BAD_ACCESS而崩溃。在玩了一段时间之后,无缘无故地发生了。异常断点以及在分配/仪器中启用NSZombie检测并不能提供任何信息,因此我无法在代码中检测到导致错误的行。

这是回溯:

* thread #1: tid = 0x5d267, 0x2fd7c760 SpriteKit`SKCSprite::update(double) + 328, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xc)
frame #0: 0x2fd7c760 SpriteKit`SKCSprite::update(double) + 328
frame #1: 0x2fd2cec8 SpriteKit`-[SKScene _update:] + 200
frame #2: 0x2fd4a8ae SpriteKit`-[SKView(Private) _update:] + 686
frame #3: 0x2fd47a44 SpriteKit`-[SKView renderCallback:] + 748
frame #4: 0x2fd4485c SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 116
frame #5: 0x2fd75fcc SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 248
frame #6: 0x2f91ad7a QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 98
frame #7: 0x2f91abe2 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 366
frame #8: 0x341ca82e IOMobileFramebuffer`IOMobileFramebufferVsyncNotifyFunc + 90
frame #9: 0x2d94a51c IOKit`IODispatchCalloutFromCFMessage + 256
frame #10: 0x2c9dcbe4 CoreFoundation`__CFMachPortPerform + 132
frame #11: 0x2c9ed022 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34
frame #12: 0x2c9ecfbe CoreFoundation`__CFRunLoopDoSource1 + 346
frame #13: 0x2c9eb5e0 CoreFoundation`__CFRunLoopRun + 1608
frame #14: 0x2c938db0 CoreFoundation`CFRunLoopRunSpecific + 476
frame #15: 0x2c938bc2 CoreFoundation`CFRunLoopRunInMode + 106
frame #16: 0x33cc4050 GraphicsServices`GSEventRunModal + 136
frame #17: 0x2ff04a30 UIKit`UIApplicationMain + 1440
* frame #18: 0x001073cc p01g01`main(argc=1, argv=0x00456bd4) + 116 at main.m:16

显然,问题以某种方式与SpriteKit相关联。

在iOS7上,游戏运行没有任何问题。

有没有其他方法可以找到并消除问题?

2 个答案:

答案 0 :(得分:1)

所以,显然问题出在removeFromParent

更改后:

SKAction *remove = [SKAction removeFromParent];
[self runAction:[SKAction sequence:@[wait, remove]]];

为:

[self runAction:wait completion:^{
    [self removeFromParent];
}];

错误已经消失,但另一个出现了:

SpriteKit`SKCShapeSprite::getAccumulatedBounds()

请前往SpriteKit: EXC_BAD_ACCESS SpriteKit`SKCShapeSprite::getAccumulatedBounds() crash了解详情。

<强>更新 事实证明,我领先于自己:错误在几个小时后再次出现。现在我有两种无法解决的问题,并且考虑从头开始专门为iOS8重写游戏。

答案 1 :(得分:0)

通过为name属性设置唯一名称来尝试此操作。某种程度上对我有用。

static NSInteger count = 0;

@interface Power ()

- (instancetype)init
{
    if (self = [super init]) {
        count++;
        self.name = @(count).stringValue;
    } return self
}

@end

请注意,对象不止一次解除分配。也许是因为无法将一个对象区分为同一类型的另一个对象。