升级到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上,游戏运行没有任何问题。
有没有其他方法可以找到并消除问题?
答案 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
请注意,对象不止一次解除分配。也许是因为无法将一个对象区分为同一类型的另一个对象。