Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Game sometimes crashes when removing CADisplayLink from run loop

This doesn't happen every time you play the game, maybe once for every 5 or 10 plays. When the game ends, I remove my CADisplayLink (which I use to animate the playing area, a bit like the pipes in Flappy Bird) from the run loop. However, on the few occasions, it crashes on that line. Next to the line, it has:

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

This is the code:

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)
    });
}

if I comment out the first CADisplayLink part, it will just crash on the second anyway.

This is the stacktrace:

enter image description here

Which has the same "Thread 1" error as above.

What is going on??

like image 526
user2397282 Avatar asked Oct 27 '25 06:10

user2397282


2 Answers

You must invalidate display links (rather than just removing them from the run loop) because if they are in the middle of running when they activate they may still try to use their associated run loop.

like image 61
David Doyle Avatar answered Oct 29 '25 21:10

David Doyle


Which run loop are you adding the CADisplayLink to? You might need to be using NSRunLoop.mainRunLoop() instead.

Also, if your CADisplayLink is only being added on one NSRunLoop, you could try calling blockUpdateDisplayLink.invalidate() instead of removing it.


If you post the code where you create the CADisplayLink objects, it will make it easier to track down the issue.

like image 23
Craig Siemens Avatar answered Oct 29 '25 22:10

Craig Siemens



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!