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,所以相对前者来说准时一点
网友评论