[英]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
對象的位置發布代碼,則可以更輕松地跟蹤問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.