并非每次玩游戏时都会发生这种情况,也许每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”错误。

到底是怎么回事??

最佳答案

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

另外,如果仅将CADisplayLink添加到一个NSRunLoop上,则可以尝试调用blockUpdateDisplayLink.invalidate()而不是将其删除。

如果将代码发布到创建CADisplayLink对象的位置,这将使查找问题更加容易。

关于ios - 从运行循环中删除CADisplayLink时,游戏有时会崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25565384/

10-09 00:28