【OC & Swift】iOS定时器

发布时间 2023-11-29 17:13:30作者: 码出境界

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