为什么我不能停止NSTimer?

时间:2015-08-28 19:08:29

标签: ios iphone swift

我完全碰到了墙。这不应该像我一样困难。我启动计时器,没问题。当我试图阻止它时,它会继续下去。我已经尝试以通常的方式进行无效,但基本上由于某些原因它被忽略了。我做错了什么?!

代码:

var random = CGFloat()

var timer = NSTimer()

var counter = 0 as CGFloat

func startCountdown() {

    counter = 0

    random = CGFloat(Float(arc4random()) / Float(UINT32_MAX) * 5)

    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true)

}

func stopCountdown() {

    timer.invalidate()

}

@IBAction func startGame(sender: AnyObject) {

    startCountdown()

}

func updateCounter() {

    counter++

    println("counter: \(counter) random: \(random)")

}

@IBAction func tapped(sender: AnyObject) {

    if counter >= random {

        println("Good job")

        stopCountdown()

        //startCountdown()


    } else {

        println("Game over")

    }

}

2 个答案:

答案 0 :(得分:2)

我认为你的内存中有一个孤儿NSTimer。因为NSTimer是在运行循环上安排的,所以当你覆盖指向它们的实例变量时,它们不一定被释放。

我期望发生的是你在第一次失效发生之前以某种方式安排计时器两次。当您在startCountdown()中安排新的计时器时,您会覆盖之前的计时器,但不会使其无效。如果你以某种方式调用了startCountdown() / startGame()两次,这意味着你有stopCountdown无法影响的静止计时器,因为timer实例变量现在正在指向在另一个对象。

如果这是正在发生的事情,修复很容易 - 只需在安排新计时器之前使startCountdown()中的旧计时器无效。

答案 1 :(得分:0)

我的startButton启动了NSTimer,而tapped同时启动了另一个计时器。我只是稍微重新安排了应用程序。我最初使用viewDidLoad()启动了计时器。