iOS控件NSTimer计时器

本文详细介绍了NSTimer的使用方法,包括启动、停止、设置暂停时间等关键操作,并探讨了如何解决内存泄漏及循环引用等问题。

先熟悉一下NSTimer(定时器)的常用属性

// 启动
-(void)fire ;
// 停止(注:这个是唯一一个可以将计时器从runloop中移出的方法。)
- (void)invalidate; 

NSTimer为了取消内存以及和循环引用的问题 ,在NSTimer停止的时候(invalidate)要做的处理

// 停止  从Runlop中移除
[timer invalidate];

// 放在内存溢出,重置为nil
timer = nil;     

设置暂停时间

//暂停
[timer setFireDate:[NSDate distantFuture]];

大家注意这个暂停时间,是指未来的某一个时间,时间就存在很大的不确定性了。
但是有时候就,要在指定的时间以后重新开始启动NSTimer的属性方法。

/** *  设置NSTimer暂停时间 * 
 *  @param timer     NSTimer对象 
 *  @param paushTIme 设置暂停时间 
*/
-(void)NStimerSetPaushTime:(NSTimer *)timer paushT:(NSInteger)paushTIme {   
 [timer setFireDate:[NSDatedistantFuture]];    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(paushTIme * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        
  /**即刻开启*/        
[timer setFireDate:[NSDatedate]];

 });
}

有人说说可以用 timeInterval 这个属性,想了一下不过也有道理。但是假如你之前设置的属性间隔是5秒,在程序某一段的时候要让他暂停10秒后执行。这个时候你又重新设置了时间间隔的这个属性。这时你的时间间隔属性就是你最后设置的10秒了,这个NSTimer的属性就变了。

[timer invalidate]是唯一的方法将定时器从循环池中移除
NSTimer可以精确到50-100毫秒.
NSTimeInterval类:是一个浮点数字,用来定义秒
NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了.

### 实现 AVAudioPlayer 和 NSTimer 定时播放音频 为了实现在 iOS 中使用 `AVAudioPlayer` 结合 `NSTimer` 来定时播放音频的功能,可以按照如下方式构建应用程序逻辑: #### 初始化 AVAudioPlayer 并加载音频文件 首先,在视图控制器中声明并初始化 `AVAudioPlayer` 对象来准备要播放的音频资源。 ```objective-c #import <AVFoundation/AVFoundation.h> @interface ViewController () { AVAudioPlayer *audioPlayer; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *path = [[NSBundle mainBundle] pathForResource:@"exampleSong" ofType:@"mp3"]; NSURL *fileURL = [NSURL fileURLWithPath:path]; NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; if (!audioPlayer) { NSLog(@"Error creating player:%@", [error localizedDescription]); } } ``` 这段代码展示了如何创建一个 `AVAudioPlayer` 的实例,并通过指定路径加载音频文件[^1]。 #### 设置计时器以定期更新进度条或其他UI组件 接下来定义一个方法用于启动计时器,该计时器会周期性调用另一个函数去刷新 UI 或者执行其他操作。 ```objective-c - (void)startTimer { timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES]; } - (void)updateProgress:(NSTimer *)theTimer { float currentTimeInSeconds = self.audioPlayer.currentTime; // 获取当前播放位置的时间戳 // 更新界面控件显示的信息... } ``` 此部分实现了每半秒触发一次的方法 `updateProgress:` ,它读取了来自 `AVAudioPlayer` 当前时刻的数据[^2]。 #### 控制音频播放状态以及清理工作 当不再需要继续播放时停止计时器和释放占用资源非常重要。可以在适当的地方加入下面这样的处理逻辑: ```objective-c - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self stopPlaybackAndCleanup]; } - (void)dealloc { [self stopPlaybackAndCleanup]; [super dealloc]; } - (void)stopPlaybackAndCleanup { [timer invalidate]; // 停止计时器 [audioPlayer stop]; // 停止播放声音 [audioPlayer release], audioPlayer = nil; // 清理内存中的player对象 } ``` 这里包含了两个重要的方面:一是确保在离开页面之前关闭所有活动部件;二是遵循 Objective-C 编程习惯正确管理手动引用计数下的内存分配[^4]。 #### 后台调整音量的例子 如果希望能够在应用进入后台之后仍然能够改变正在播放的声音大小,则可以根据具体需求设置相应的通知监听机制或利用系统提供的 API 进行更深入的操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值