timer - ShenYj/ShenYj.github.io GitHub Wiki
在 iOS 上 Timer 的方案有
- NSTimer
- CADisplayLink
- GCD
NSTimer
可能是最常见的定时器方案,与 CADisplayLink
都会产生循环引用
解决循环引用的方案有
- 使用 block 而不是 target
- 通过中间件(
NSObject
), 通过快速转发forwardingTargetForSelector
, 返回消息的处理者 - 通过中间件(
NSProxy
),通过代理实现methodSignatureForSelector
&forwardInvocation
完成转发 - 直接使用 GCD
CADisplayLink
对比 NSTimer
精度更高一些,接近于屏幕刷新率
NSProxy
常见于一些开源框架
GCD
不同于前两者,不依赖于 RunLoop
, 直接利用系统内核,精度更高,RxSwift
就是使用的 GCD Timer
GCD
的定时器使用并不复杂,早期也是倾向于直接使用 GCD 来实现定时器功能,直接避免了去处理循环引用的问题