run loop与NSTimer,如何让NSTimer精准且不引起内存泄露?
异步创建NSTimer,创建并开启runloop,不需要NSTimer时则invalidate。
例1:异步定时器
@interface NextViewController ()
{
NSTimer *_timer;
NSInteger _timerNumber;
}
@end
//开启定时器
- (void)runTimer
{
if (!_timer) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self->_timer = [NSTimer timerWithTimeInterval:0.0001f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self->_timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
NSLog(@"NSRunLoop销毁");
});
}
}
- (void)timerAction
{
NSLog(@"%ld time!",(long)_timerNumber++);
}
//停止定时器
- (void)removeTimer
{
if (_timer) {
[_timer invalidate];
NSLog(@"定时器销毁");
}
}
说明:
repeats参数是NO,则只执行一次;YES,则重复执行;
runloop销毁:异步线程任务结束时销毁;
例2: 同步定时器
_timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];