NSTimer 不触发选择器

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

NSTimer 是 iOS 开发中常用的一个类,用于在指定的时间间隔内重复执行代码块或方法。然而,有时候我们可能会遇到 NSTimer 不触发选择器的问题,导致代码无法按预期执行。本文将探讨一些可能导致 NSTimer 不触发选择器的原因,并提供解决方案。

1. 定时器未正确添加到运行循环

当我们创建一个 NSTimer 对象时,需要将其添加到当前的运行循环中,以使其能够正常工作。如果我们忘记将定时器添加到运行循环,那么即使我们已经正确地设置了时间间隔和触发方法,定时器也不会被触发。

解决方案:在创建 NSTimer 对象后,使用 NSRunLoop 的 addTimer:forMode: 方法将定时器添加到当前的运行循环中。示例代码如下:

swift

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

NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)

2. 定时器的引用计数不正确

当我们创建一个 NSTimer 对象后,需要确保该对象被正确地保持在内存中,以免被释放导致定时器失效。如果我们没有正确地保持对定时器对象的引用,那么定时器将被释放,从而无法触发选择器。

解决方案:在创建 NSTimer 对象后,使用一个强引用变量来持有该对象。示例代码如下:

swift

class ViewController: UIViewController {

var timer: NSTimer?

override func viewDidLoad() {

super.viewDidLoad()

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

}

func timerFired() {

// 定时器触发时执行的代码

}

}

3. 定时器所在的线程没有运行循环

NSTimer 对象需要运行在一个具有运行循环的线程中,以便能够触发选择器。如果我们在没有运行循环的线程中创建并启动定时器,那么定时器将无法正常工作。

解决方案:确保在一个具有运行循环的线程中创建和启动定时器。如果需要在后台线程中使用定时器,可以手动创建一个运行循环并将其配置为长期运行。示例代码如下:

swift

class MyThread: NSThread {

override func main() {

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

NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)

NSRunLoop.currentRunLoop().run()

}

func timerFired() {

// 定时器触发时执行的代码

}

}

let thread = MyThread()

thread.start()

在使用 NSTimer 时,如果遇到定时器不触发选择器的问题,可以首先检查定时器是否正确添加到运行循环中,并确保对定时器对象的引用计数正确。另外,需要确保定时器所在的线程具有运行循环。通过解决以上问题,我们可以确保 NSTimer 正常触发选择器,从而使代码按预期执行。

希望本文对解决 NSTimer 不触发选择器的问题有所帮助。如果你有任何疑问,请随时在评论区提问。谢谢阅读!