簡體   English   中英

從運行循環中刪除CADisplayLink時,游戲有時會崩潰

[英]Game sometimes crashes when removing CADisplayLink from run loop

每次玩游戲時都不會發生這種情況,也許每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對象的位置發布代碼,則可以更輕松地跟蹤問題。

我真的建議你用Instruments和NSZombies調試你的代碼,找出你的內存問題。

儀器

NSZombies

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM