Как аннулировать NSTimer, который был запущен несколько раз

Я сделал практический проект в Свифт, чтобы узнать, как работает NSTimer. Существует одна кнопка для запуска таймера и одна кнопка для ее отмены. Он отлично работает, когда я нажимаю каждую кнопку один раз. Однако, когда я нажимаю кнопку запуска таймера несколько раз, я больше не могу ее аннулировать.

введите описание изображения здесь

Вот мой код:

class ViewController: UIViewController {

    var counter = 0
    var timer = NSTimer()

    @IBOutlet weak var label: UILabel!

    @IBAction func startTimerButtonTapped(sender: UIButton) {
        timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
    }

    @IBAction func cancelTimerButtonTapped(sender: UIButton) {
        timer.invalidate()
    }

    func update() {
        ++counter
        label.text = "\(counter)"
    }
}

Я видел эти вопросы, но мне не удалось получить ответ на мой вопрос (многие из них - старые Obj-C pre-ARC дни, а другие - разные проблемы):

Ответ 1

Вы можете добавить timer.invalidate(), прежде чем запускать новый таймер в startTimerButtonTapped, если вы хотите reset таймер при каждом нажатии кнопки "Пуск":

@IBAction func startTimerButtonTapped(sender: UIButton) {
    timer.invalidate()
    timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}

Я собирался обновить с объяснением, но @jcaron уже сделал это в комментарии, поэтому я просто цитирую его текст, не нужно его менять:

Каждый раз, когда вы нажимаете кнопку "Start Timer", вы создаете новый таймер, оставляя предыдущий, но не ссылаясь на него (поскольку вы перезаписали timer с помощью нового таймера, который вы только что создали). Перед созданием нового необходимо аннулировать предыдущий.

Ответ 2

Я хотел бы предложить вам установить таймер на ноль, когда нажимают кнопку отмены. И не забудьте установить counter = 0 При аннулировании таймера.