1:NSTimer
UIScrollView 拖动时执行的是 UITrackingRunLoopMode,会导致暂停定时器,等恢复为 NSDefaultRunLoopMode 时才恢复定时器。
所以如果需要定时器在 UIScrollView 拖动时也不影响的话,建议添加到 UITrackingRunLoopMode 或 NSRunLoopCommonModes 中:
1 NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
2 [[NSRunLoop mainRunLoop] addTimer:timer forMode: UITrackingRunLoopMode];
注意:将计数器的repeats设置为YES的时候,self的引用计数会加1。因此可能会导致self(即viewController)不能release,所以,必须在viewWillAppear的时候,将计数器timer停止,否则可能会导致内存泄露。
runLoop会将定时器进行强引用,导致target对象释放不了。
自动添加到runtime
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];
手动添加的runloop
NSTimer *myTimer = [NSTimer timerWithTimeInterval:3.0 target:selfselector:@selector(timerFired:)userInfo:nilrepeats:NO];
[[NSRunLoop currentRunLoop] addTimer:myTimerforMode:NSDefaultRunLoopMode];
-(void)fire;方法来立即触发该定时器
在重复执行的定时器中调用此方法后立即触发该定时器,但不会中断其之前的执行计划;
在不重复执行的定时器中调用此方法,立即触发后,就会使这个定时器失效。
2:CADisplayLink:CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。用法和timer一样
3:GCD
延迟执行一次:
double delayInSeconds = 2.0;
2 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
3 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
4 //执行事件
});
重复执行
1 NSTimeInterval period = 1.0; //设置时间间隔
2 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
3 dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
4 dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行
5 dispatch_source_set_event_handler(_timer, ^{
6 //在这里执行事件
7 });
8 dispatch_resume(_timer);
//释放定时器
dispatch_source_cancel(_timer);
_timer = nil;