1、由于ios是通过runLoop作为消息循环机制,主线程默认启动了runLoop,可是子线程没有默认的runLoop,因此在子线程启动runLoop即可。
2、runLoop的mode问题
如果timer是add到defaultRunLoopMode中,会出现滑动中UITrackingRunLoopMode得不到调度,导致定时器失效。
因为UITrackingRunLoopMode和KCFRunLoopDefaultMode都标记了common模式,所以可通过将timer添加到runLoopCommonModes实现在默认和追踪模式都能正常运行。
3、dealloc和定时结束时执行invalidate,置空timer。避免内存泄漏
在iOS中我们常用的定时器有三种: Timer, CADisplayLink, DispatchSourceTimer
Timer是我们最常见的定时器,当定时器创建完(不用 scheduled 的,需要手动添加到 runloop 中)后,该定时器将在初始化时指定的 t 秒后自动触发。我们经常围绕它的俩个问题是 精度 和 循环引用 问题。
如果Timer是加在main runloop中,就很容易因为主线程忙于各种UI *** 作或者复杂的运算导致阻塞线程,从而使得NSTimer延迟执行,导致精度较低。
Timer如果想要更高点的精度,我们可以从以下几个方面考虑
我们知道Timer的调用有target-action和block俩种方式,其中target-action会导致循环引用,造成内存泄露的问题, 因为target, action,runLoop之间有强引用链导致,解决办法
1.使用block回调方式
2.使用NSProxy类作为中间对象
CADisplayLink通过和屏幕刷新相同的频率将内容显示到屏幕上。也是依赖于NSRunLoop运行,iOS设备的屏幕刷新频率是固定的,CADisplayLink在通常都会在在每次刷新结束调用,精度较高,更适合做屏幕刷新等
DispatchSourceTimer精度很高,因为是系统级别,且是不受RunLoop影响。
常见基础用法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)