发布时间:2026-05-15 13:15:21 浏览次数:0
你知道吗?刚学iOS开发那会儿,我写了个倒计时功能,结果手机烫得能煎鸡蛋。后来发现全是scheduledTimerWithTimeInterval这个定时器方法惹的祸——你猜怎么着?我连最基本的运行原理都没搞明白!
简单来说,定时器就像你手机的闹钟。比如每天早上7点叫你起床,在代码里就是让手机每隔固定时间执行某个操作。scheduledTimerWithTimeInterval这个方法的特别之处在于,它会自动帮你把闹钟绑定到当前线程的”邮局”(RunLoop)里。
假设我们要做个每秒更新数字的计数器,核心代码就三行: 1. 定义触发动作:写个@objc标记的方法,比如updateCounter() 2. 设置时间间隔:这里填1.0表示1秒 3. 启动定时器:用scheduledTimer方法把前两步串起来
swift var timer: Timer? timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateCounter), userInfo: nil, repeats: true)
这时候可能有同学要问了:”为啥我的定时器点了返回按钮还在跑?” 这就是典型的内存泄漏问题。想象一下,定时器就像个粘人的跟屁虫,如果你不明确说”别跟了”,它会一直抓着你的ViewController不放。
前两天有个学员发来段代码,说定时器怎么都触发不了。我一看乐了——他在viewDidLoad里写的定时器,但没把timer赋值给属性变量。系统刚创建完定时器,转头就被ARC回收了,这能工作才见鬼了!
还有个更隐蔽的情况:当你的selector方法写错参数。比如应该带timer参数的: swift @objc func handleTimer(_ timer: Timer) { … } 结果新手经常写成空参数,这时候方法签名对不上,定时器就哑火了。
现在流行用闭包方式创建定时器,既能避免循环引用,代码也更清爽: swift Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in self?.updateCounter() } 注意这里必须用[weak self],否则闭包会强持有self,又回到内存泄漏的老问题。
小编最后说句大实话:定时器用得好是神器,用不好就是耗电炸弹。记住三个关键点——及时销毁、注意线程、小心循环引用,保准你写的定时器既准又稳。下次遇到定时器崩溃,先检查这三点准没错!