【问题标题】:EXC_BAD_ACCESS Sprite KitEXC_BAD_ACCESS 精灵套件
【发布时间】:2014-10-04 21:29:58
【问题描述】:

我已经在这个网站和谷歌上寻找了大约一周的时间,现在试图解决我的应用程序中的一个错误。看起来内存管理是问题所在,并且带有僵尸的断点/仪器不会返回任何东西。我所能弄清楚的是问题源于这段代码。当应用程序在某些情况下运行时,它会在我的 main.m 上返回 EXC_BAD_ACCESS。我认为这是问题所在,但提前感谢您查看它!

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

if (!gameOver && gameStarted) {

[lines runAction:[SKAction removeFromParent]];
dotDrawn = NO;

UITouch* touch = [touches anyObject];
CGPoint positionInScene = [touch locationInNode:self];

pos2x = positionInScene.x;
pos2y = positionInScene.y;

lines = [SKShapeNode node];

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, pos1x, pos1y);
CGPathAddLineToPoint(path, NULL, pos2x, pos2y);

lines.path = path;
lines.strokeColor = [UIColor grayColor];
[lines setLineWidth:3];

[self addChild:lines];
}

}

【问题讨论】:

  • 添加异常断点并将任何崩溃消息发布到日志中。请注意,您泄漏了 cgpath 对象,您必须释放它。
  • @LearnCocos2D 我会在今天晚些时候有机会时尝试断点异常,但我会在哪里 cgpathrelease ?感谢您的帮助!
  • lines.path = path;线。您仍然“拥有”路径,因此您必须释放它。 ARC 不会自动释放 CGPath 等核心基础对象。
  • @LearnCocos2D 嘿,我尝试了断点异常和添加 CGPathRelease(path);但崩溃和异常仍然发生。如果您有任何其他想法,我很想听听,但如果没有,至少感谢您查看它!
  • 异常断点应该向您显示最接近源代码仍然可用的错误的代码行。 Xcode 在崩溃时突出显示哪一行?

标签: sprite-kit ios8 exc-bad-access


【解决方案1】:

我遇到了同样的问题,症状相同:代码在 iOS7.1 中工作,但在 iOS8 中开始因 EXC_BAD_ACCESS 而崩溃;试图用僵尸追踪不良访问的根源并没有帮助。

以下是我解决问题的方法:消除所有对 [SKAction removeFromParent] 的使用。

对于您的示例,这意味着将 [lines runAction:[SKAction removeFromParent]] 替换为 [lines removeFromParent]

有点棘手的是替换这样的东西:

[myNode runAction:[SKAction sequence:@[ [SKAction fadeOutWithDuration:1.0],
                                        [SKAction removeFromParent] ]]];

用这个:

[myNode runAction:[SKAction fadeOutWithDuration:1.0] completion:^{
    [myNode removeFromParent];
}];

编辑:使用正确的搜索词,我找到了指向another question describing the same problem 的链接。

【讨论】:

  • 谢谢!这是一个救命稻草,我终于能够在很多很多小时内停止计时器以解决这个错误。再次感谢!