美文网首页ios⋯⋯runloop runtime深入理解RunLoop
iOS RunLoop 总结以及相关面试题解答

iOS RunLoop 总结以及相关面试题解答

作者: Lucky_Roc | 来源:发表于2019-01-10 15:45 被阅读1次

    Runloop

    Runloop是事件接收和分发机制的一个实现。是线程相关的基础框架的一部分。一个Runloop就是一个事件处理的循环,用来不停的调度工作及处理输入事件。使用runloop的目的就是让你的线程

    RunLoop的主要目的:

       保证程序执行的线程不会被系统终止,如果没有RunLoop,UIApplicationMain函数执行完毕之后将直接返回,就是说程序一启动然后就结束,在有工作的时候忙于工作,而没有工作的时候处于休眠状态,
    

    什么时候使用Runloop

       当需要和该线程进行交互的时候才会使用Runloop.
    

    Runloop Mode

    image

    一个Runloop可能有几个mode

    Runloop Mode 实际上是 Source,Timer 和 Observer 的集合,不同的 Mode 把不同组的SourceTimerObserver隔绝开来。Runloop` 在某个时刻只能跑在一个 Mode 下,处理这一个 Mode 当中的 Source,Timer 和 Observer。

    苹果文档中提到的 Mode 有五个,分别是:

    NSDefaultRunLoopMode:默认的mode,正常情况下都是在这个mode
    NSConnectionReplyMode
    NSModalPanelRunLoopMode
    NSEventTrackingRunLoopMode:使用这个Mode去跟踪来自用户交互的事件(比如UITableView上下滑动)
    NSRunLoopCommonModes

    iOS 中公开暴露出来的只有 NSDefaultRunLoopModeNSRunLoopCommonModesNSRunLoopCommonModes 实际上是一个 Mode 的集合,默认包括 NSDefaultRunLoopModeNSEventTrackingRunLoopMode

    Source

    即可以唤醒Runloop的一些事件。比如用户点击了屏幕,就会创建一个input source。

    • source0 : 非系统事件
    • source1 : 系统时间

    Timer

    我们经常用的NSTimer就属于这一类。

    Observer

    某个observer可以监听runloop的状态变化,并作出一定反应。

    RunLoop运行流程

    经典大图


    image

    没有事情的时候,Runloop处于休眠状态。当外部source将其唤醒后,它会依次处理接收到的timer/source,然后再次进入休眠。

    常见的面试题:

    Runloop和线程是什么关系?

    每条线程都有唯一的一个与之对应的RunLoop对象;主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建;RunLoop在第一次获取时创建,在线程结束时销毁

    Runloop的mode作用是什么?

    指定事件在运行循环中的优先级的,

    线程的运行需要不同的模式,去响应各种不同的事件,去处理不同情境模式。(比如可以优化tableview的时候可以设置UITrackingRunLoopMode下不进行一些操作,比如设置图片等。)

    +scheduledTimerWithTimeInterval:的方式触发的timer,在滑动页面上的列表时,timer会暂停回调, 为什么?

    滑动scrollView时,主线程的RunLoop会切换到UITrackingRunLoopMode这个Mode,执行的也是UITrackingRunLoopMode下的任务(Mode中的item),而timer是添加在NSDefaultRunLoopMode下的,所以timer任务并不会执行,只有当UITrackingRunLoopMode的任务执行完毕,runloop切换到NSDefaultRunLoopMode后,才会继续执行timer。

    如何解决在滑动页面上的列表时,timer会暂停回调?

    Timer放到NSRunLoopCommonModes中执行即可

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    [[NSRunLoop currentRunLoop] run];
    

    NSTImer使用时需要注意什么?

    • 注意timer添加到runloop时应该设置为什么mode
    • 注意timer在不需要时,一定要调用invalidate方法使定时器失效,否则得不到释放

    相关文章

      网友评论

        本文标题:iOS RunLoop 总结以及相关面试题解答

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