【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// 很远的将来 }