3

并不是每次玩游戏时都会发生这种情况,可能每玩 5 次或 10 次就会发生一次。当游戏结束时,我从运行循环中删除了我的 CADisplayLink(我用它来为游戏区域设置动画,有点像 Flappy Bird 中的管道)。但是,在少数情况下,它会在那条线上崩溃。在该行旁边,它具有:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)

这是代码:

func endGame(r : String) {

    UIView.animateWithDuration(0.4, delay: 0.2, options: .CurveLinear, animations: {
        self.scoreLabel.alpha = 0
        }, completion: {
            (finished: Bool) in
            self.scoreLabel.removeFromSuperview()
    });

    self.view.userInteractionEnabled = false
    reason = r
    println("Game Over!!!")

    //Crashes on this line
    blockUpdateDisplayLink.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)

    shiftDisplayLink.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)

    scoreTimer.invalidate()

    UIView.animateWithDuration(0.0001, delay: 0.7, options: .CurveLinear, animations: {

        }, completion: {
            (finished: Bool) in
            self.performSegueWithIdentifier("Game Over", sender: self)
    });
}

如果我注释掉第一个 CADisplayLink 部分,它只会在第二个部分崩溃。

这是堆栈跟踪:

在此处输入图像描述

它具有与上述相同的“线程 1”错误。

到底是怎么回事??

4

3 回答 3

5

您必须使显示链接无效(而不仅仅是将它们从运行循环中删除),因为如果它们在激活时处于运行状态,它们可能仍会尝试使用其关联的运行循环。

于 2014-09-05T10:01:59.480 回答
3

您要添加到哪个运行循环CADisplayLink?您可能需要改为使用 NSRunLoop.mainRunLoop()

此外,如果您CADisplayLink只被添加到一个NSRunLoop,您可以尝试调用blockUpdateDisplayLink.invalidate()而不是删除它。


如果您在创建CADisplayLink对象的位置发布代码,则可以更轻松地跟踪问题。

于 2014-09-03T22:11:17.450 回答
1

我真的建议您使用 Instruments 和 NSZombies 调试您的代码,并找出您的内存问题。

仪器

NS僵尸

于 2014-09-05T09:56:01.390 回答