【OC & Swift】iOS定时器
1 概述
对于定时器的使用,主要就是关注3个方面:(1)创建并启动一个定时器(重复/不重复);(2)定时器的销毁,防止内存泄漏;(3)定时器的开启和关闭。
另外在OC和Swift中,写法上有些细节注意下,详情看下面的代码块示例。
2 OC语言
2.1 Timer实例对象的创建
NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) { NSLog(@"timer1 print"); }]; NSTimer *timer2 = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timer2Action) userInfo:nil repeats:YES]; NSTimer *timer3 = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timer3Action:) userInfo:@"123" repeats:YES]; - (void)timer2Action { NSLog(@"timer2 print"); } - (void)timer3Action:(NSTimer *)timer { NSLog(@"timer3 print, userInfo = %@", timer.userInfo); }
2.2 Timer实例对象的销毁
invalidate和 = nil 一起上吧。
对timer对象调用invalidate方法后,定时器所占用的内存并不会立即释放,它将在系统认为合适的时候被释放。
timer不用了,就及时销毁,为了保险起见,至少要在dealloc方法中做下销毁。
- (void)dealloc { [self.timer invalidate]; self.timer = nil; }
2.3 定时器的开启和关闭
这种方式区别于创建/销毁,应用场景,比如计算用户在当前页面停留的时间,那么当页面didDisappear时计时器就关闭,等didAppear时计时器就开启:
// 页面将要进入前台,开启定时器 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 开启定时器 [self.timer setFireDate:NSDate.distantPast];// 很远的过去 } // 页面消失,进入后台不显示该页面,关闭定时器 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; // 关闭定时器 [self.timer setFireDate:NSDate.distantFuture];// 很远的将来 }
3 Swift语言
3.1 Timer实例对象的创建
let timer1 = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in print("timer1 print") } let timer2 = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(timer2Action), userInfo: nil, repeats: true) let timer3 = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(timer3Action), userInfo: "123", repeats: true) @objc private func timer2Action() { print("timer2 print") } @objc private func timer3Action(_ timer: Timer) { print("timer3 print, userInfo = \(String(describing: timer.userInfo))") }
3.2 Timer实例对象的销毁
invalidate和 = nil 一起上吧。
对timer对象调用invalidate方法后,定时器所占用的内存并不会立即释放,它将在系统认为合适的时候被释放。
timer不用了,就及时销毁,为了保险起见,至少要在deinit方法中做下销毁。
deinit { self.timer?.invalidate() self.timer = nil }
3.3 定时器的开启和关闭
这种方式区别于创建/销毁,应用场景,比如计算用户在当前页面停留的时间,那么当页面didDisappear时计时器就关闭,等didAppear时计时器就开启:
// 页面将要进入前台,开启定时器 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 开启定时器 self.timer?.fireDate = Date.distantPast// 很远的过去 } // 页面消失,进入后台不显示该页面,关闭定时器 override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) // 关闭定时器 self.timer?.fireDate = Date.distantFuture// 很远的将来 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2018-11-29 【规范建议】服务端接口返回字段类型与iOS端的解析