【问题标题】:Game sometimes crashes when removing CADisplayLink from run loop从运行循环中删除 CADisplayLink 时游戏有时会崩溃
【发布时间】:2014-08-29 09:25:05
【问题描述】:

这种情况不会在您每次玩游戏时发生,可能每玩 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”错误。

发生了什么事??

【问题讨论】:

    标签: ios xcode swift breakpoints cadisplaylink


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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


      如果您在创建 CADisplayLink 对象的位置发布代码,将更容易追踪问题。

      【讨论】:

        【解决方案3】:

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

        Instruments

        NSZombies

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多