iOS定时器

作者: Hugin | 来源:发表于2019-04-26 14:17 被阅读5次

    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定时器

        本文链接:https://www.haomeiwen.com/subject/gsufnqtx.html