iOS定时器

NSTimer

NSThimer 初始化时,需要对其强引用,不然的话会被释放,定时器就会失效,但是如果 self 对 timer 进行强引用,而 NSThimer 初始化时 target 又对 self 强引用,那么就会产生循环引用

解决方法

1.通过 block 的方式初始化给 NSThimer 传递事件,block 内部进行弱引用当前 self

2.可以通过代理对象(NSProxy)或中间对象间接的成为 NSThimer 的 target 并在其内部进行消息转发给原对象,传递定时器事件,代理对象对 self 进行引用,定时器回调事件时,让 self 响应事件

注意点

1.NSTimer 依赖于 RunLoop,如果 RunLoop 的任务过于繁重,可能会导致 NSTimer不准

2.子线程RunLoop默认没有开启,如果在子线程中使用 NSTimer,那么定时器会失效


GCD定时器

1.创建定时器

dispatch_source_t timer = dispatch_source_create(type, handle, mask, queue)

2.设置时间点

dispatch_source_set_timer(source, start, interval, leeway)

3.设置回调事件

dispatch_source_set_event_handler(source, ^{})

4.启动定时器

dispatch_resume(object)

GCD定时器不依赖 Runloop,所以相对前者来说准时一点

你可能感兴趣的:(iOS定时器)