nstimer 是 iOS 开发中一个常用的工具,用于执行周期性的任务。它的工作原理是将自身添加到RunLoop(运行循环)中,然后按照设定的时间间隔触发指定的方法。在本文中,我们将深入探讨如何在 iOS 中使用 NSTimer,以及使用过程中需要注意的关键点。
**1. NSTimer 的基本使用**
创建一个 NSTimer 需要以下四个关键参数:
- **timeInterval**: 这是定时器触发间隔的时间,以秒为单位。
- **target**: 定时器触发时执行的方法所在的对象。
- **selector**: 这是定时器触发时要执行的方法名。
- **userInfo**: 可选参数,可以传递数据给执行方法。
- **repeats**: 指定定时器是否重复执行。
例如,创建一个每秒执行一次的定时器,我们可以这样做:
```swift
let timer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(countDownTime), userInfo: nil, repeats: true)
```
**2. NSTimer 的内存管理**
由于 NSTimer 是基于 RunLoop 的,所以它的生命周期与 RunLoop 密切相关。为了正确释放资源,我们需要在不再使用定时器时调用 `invalidate` 方法,同时将定时器对象设为 `nil`。在 UIViewController 中,通常会在 `- (void)viewWillDisappear:(BOOL)animated` 方法中停止并释放定时器,而不是在 `- (void)dealloc` 中,因为 `-viewWillDisappear:` 会更早被调用,确保在页面消失时定时器已经停止。
```swift
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[timer invalidate];
timer = nil;
}
```
**3. 控制定时器的状态**
- **开始/启动定时器**: 设置 `fireDate` 为 `[NSDate distantPast]` 可以立即启动定时器。
- **停止定时器**: 设置 `fireDate` 为 `[NSDate distantFuture]` 可以停止定时器。
- **继续定时器**: 如果定时器已经停止,可以再次调用 `setFireDate:` 方法并传入 `[NSDate date]` 来恢复定时器的运行。
**4. 示例:倒计时功能**
倒计时是 NSTimer 的典型应用场景。以下展示了三种不同的初始化方法:
**方法1**:初始化后立即开始计时
```swift
if (self.timer == nil) {
self.time = 10.0;
NSNumber *number = @(self.time);
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDownTime:) userInfo:number repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
// 关闭方法
[self.timer invalidate];
self.timer = nil;
```
**方法2**:初始化后需要调用 `setFireDate:` 才开始计时
```swift
if (self.timer == nil) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDownTime:) userInfo:nil repeats:YES];
[self.timer setFireDate:[NSDate distantFuture]];
}
self.time = 10.0;
[self.timer setFireDate:[NSDate distantPast]];
// 关闭方法
[self.timer setFireDate:[NSDate distantFuture]];
```
**方法3**:初始化后需要调用 `fire` 才开始计时
```swift
if (self.timer == nil) {
self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(countDownTime:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
[self.timer fire];
}
// 关闭方法
[self.timer invalidate];
self.timer = nil;
```
以上就是 iOS 中使用 NSTimer 的基本操作和注意事项。正确理解和使用 NSTimer 可以帮助开发者实现各种定时功能,比如倒计时、动画效果、网络请求重试等。在实际项目中,一定要记住在适当的时候停止并释放定时器,避免内存泄漏。