NSTimer 不会停止

作者:编程家 分类: ios 时间:2025-11-11

如何使用 NSTimer 实现定时器功能

NSTimer 是 iOS 开发中常用的一个类,用于实现定时器功能。它可以在指定的时间间隔内重复执行指定的方法,或者在指定的时间后执行一次指定的方法。然而,有时候我们会遇到一个问题,就是 NSTimer 在某些情况下无法停止。本文将介绍如何正确使用 NSTimer,并避免出现无法停止的情况。

使用 NSTimer 前的准备工作

在使用 NSTimer 之前,我们需要进行一些准备工作。首先,我们需要创建一个定时器对象,并指定定时器触发时要执行的方法。其次,我们需要指定定时器触发的时间间隔。最后,我们需要将定时器对象添加到当前的运行循环中,以确保定时器能够正常工作。

下面是一个简单的示例代码,演示了如何创建并使用 NSTimer:

swift

class ViewController: UIViewController {

var timer: NSTimer?

override func viewDidLoad() {

super.viewDidLoad()

// 创建定时器对象,并设置触发时间间隔为1秒

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)

// 将定时器对象添加到当前的运行循环中

NSRunLoop.currentRunLoop().addTimer(timer!, forMode: NSDefaultRunLoopMode)

}

func timerFired() {

print("Timer fired!")

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

}

上述代码中,我们在 `viewDidLoad()` 方法中创建了一个定时器对象 `timer`,并设置触发时间间隔为1秒。然后,我们将定时器对象添加到当前的运行循环中,以确保定时器能够正常工作。在 `timerFired()` 方法中,我们简单地打印了一条消息,用于表示定时器触发时要执行的方法。

如何停止 NSTimer

一般情况下,我们可以使用 `invalidate()` 方法来停止 NSTimer。该方法会将定时器对象从运行循环中移除,并且设置定时器对象为无效状态,从而停止定时器的触发。

下面是一个示例代码,演示了如何停止 NSTimer:

swift

class ViewController: UIViewController {

var timer: NSTimer?

override func viewDidLoad() {

super.viewDidLoad()

// 创建定时器对象,并设置触发时间间隔为1秒

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)

// 将定时器对象添加到当前的运行循环中

NSRunLoop.currentRunLoop().addTimer(timer!, forMode: NSDefaultRunLoopMode)

}

func timerFired() {

print("Timer fired!")

// 停止定时器

timer?.invalidate()

timer = nil

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

}

在上述代码中,我们在 `timerFired()` 方法中添加了停止定时器的逻辑。在定时器触发时,我们调用了 `invalidate()` 方法将定时器对象设置为无效状态,并置为 `nil`。这样,定时器就会停止触发。

避免 NSTimer 无法停止的情况

尽管使用 `invalidate()` 方法可以停止 NSTimer,但有时候我们可能会遇到 NSTimer 无法停止的情况。这通常是由于 NSTimer 的引用计数问题导致的。当我们创建一个 NSTimer 对象,并将其添加到运行循环中时,运行循环会对定时器对象进行一次强引用。如果在定时器触发之前,我们没有手动调用 `invalidate()` 方法将定时器对象从运行循环中移除,那么定时器对象就会一直保持有效状态,从而无法被释放。

为了避免这种情况的发生,我们可以在合适的时机手动调用 `invalidate()` 方法,将定时器对象从运行循环中移除。通常情况下,我们可以在 `dealloc` 方法中进行这个操作,以确保在对象被释放时,定时器也能够被正确地停止。

下面是一个示例代码,演示了如何在合适的时机停止 NSTimer:

swift

class ViewController: UIViewController {

var timer: NSTimer?

override func viewDidLoad() {

super.viewDidLoad()

// 创建定时器对象,并设置触发时间间隔为1秒

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)

// 将定时器对象添加到当前的运行循环中

NSRunLoop.currentRunLoop().addTimer(timer!, forMode: NSDefaultRunLoopMode)

}

func timerFired() {

print("Timer fired!")

}

deinit {

// 停止定时器

timer?.invalidate()

timer = nil

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

}

在上述代码中,我们在 `deinit` 方法中添加了停止定时器的逻辑。当对象被释放时,`deinit` 方法会被调用,从而停止定时器的触发。

本文介绍了如何正确使用 NSTimer,并避免出现无法停止的情况。我们首先进行了 NSTimer 的准备工作,然后演示了如何停止 NSTimer,并提出了避免 NSTimer 无法停止的建议。希望本文能够帮助你更好地使用 NSTimer 实现定时器功能。