NSTimer 简单用法以及容易造成内存泄漏解决办法
使用NSTimer最好是升级为属性,容易控制
简单使用
- 设置为属性
@property (nonatomic ,strong) NSTimer *timer; //定时器
- 懒加载
1 2 3 4 5 6
| -(NSTimer*)timer{ if (_timer == nil) { _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateUI) userInfo:nil repeats:YES]; } return _timer; }
|
- 开始动画与暂停动画
1 2 3 4 5 6 7 8 9 10 11 12
|
-(void)beginAnimation{ self.timer.fireDate=[NSDate distantPast]; }
-(void)endAnimation{ self.timer.fireDate=[NSDate distantFuture]; }
|
如果只是使用的话,这已经完了,但是会造成self无法释放
==================================
解决办法,在界面要不显示的时候把定时器注销并且置空
1 2 3 4 5
| -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.timer invalidate]; self.timer = nil; }
|
这样就可以了,可以打印dealloc测试了
GCD
dispatch source是一个监视某些类型事件的对象。当这些事件发生时,它自动将一个block放入一个dispatch queue的执行例程中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{ dispatch_cancel(timer); });
dispatch_resume(timer);
|
GCD定时器的优点有很多,首先不受Mode的影响,而NSTimer受Mode影响时常不能正常工作,除此之外GCD的精确度明显高于NSTimer,这些优点让我们有必要了解GCD定时器这种方法。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| -(void)clickOnButton { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); _timer = timer; dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC); WeakObj(self); __block NSInteger count = 0; dispatch_source_set_event_handler(timer, ^{ NSString *str = nil; if (count >= 3600) { str = [NSString stringWithFormat:@"%02d:%02d:%02d",(int)(count/3600),(int)((count%3600)/60),(int)(count%60)]; }else{ str = [NSString stringWithFormat:@"%02d:%02d",(int)(count/60),(int)(count%60)]; } MAIN(^{ selfWeak.timeLabel.text = str; }); count++; }); dispatch_resume(timer); }
|