NSTimer、CADisplayLink、dispatch_source_t 的优劣 ?
参考答案:
NSTimer、CADisplayLink和dispatch_source_t都是iOS开发中用于定时或周期性执行任务的工具,它们各自有不同的优缺点,适用于不同的场景。
- NSTimer
优点:
- 使用简单,可以通过指定的时间间隔向目标对象发送消息来实现定时功能。
- 可以设置重复执行,方便实现周期性任务。
缺点:
- 精度不高,受到主线程任务的影响,如果主线程繁忙,可能会导致定时器延迟执行。
- 在OS X v10.9以后,为了尽量避免在NSTimer触发时间到了而去中断当前处理的任务,NSTimer新增了tolerance属性,这可能会导致定时器的实际执行时间与预期时间有偏差。
- NSTimer会强引用target,而runLoop会强持有NSTimer,容易出现内存泄漏。
- CADisplayLink
优点:
- 精度高,与设备的屏幕刷新频率同步,适合用于需要精确控制时间间隔的场景,如动画、游戏等。
- 使用方便,可以设置回调函数来执行周期性任务。
缺点:
- 只能在主线程中使用,不能用于子线程。
- 受到CPU负载的影响,如果CPU负载过高,可能会导致CADisplayLink的回调延迟执行。
- dispatch_source_t
优点:
- 可以在子线程中使用,解决了NSTimer和CADisplayLink只能在主线程中使用的问题。
- 可以设置定时器的时间间隔和误差范围,灵活性较高。
缺点:
- 使用相对复杂,需要手动创建和管理dispatch_source_t对象。
- 相比于NSTimer和CADisplayLink,dispatch_source_t的API更加底层,需要更多的代码来实现相同的功能。
综上所述,这三种定时器各有优劣,选择哪种定时器取决于具体的使用场景和需求。如果需要实现简单的定时功能,可以使用NSTimer;如果需要精确控制时间间隔,可以使用CADisplayLink;如果需要在子线程中使用定时器,可以考虑使用dispatch_source_t。