初识runloop

作者: 嗯o哼 | 来源:发表于2020-07-10 17:43 被阅读0次

    一、什么是runloop

    顾名思义,运行循环。
    按照正常的逻辑,一段代码由上到下依次执行,执行完毕后,程序退出。
    对于我们的app来说,我们希望它一直在运行,等待用户的交互,并作出响应。那么就需要重复的执行代码。
    相当于一个do...while 循环
    

    没错runloop就是做这件事的。在程序的主入口 main 函数中将我们的代码包裹再while 循环中。就保证了,程序的可持续性。

    那么runloop都做了哪些事情,仅仅是单纯的一个循环吗,有什么优化呢?
    

    二、runloop的基本作用

    程序运行的过程中,当没有任何交互的时候,我们希望程序,处于休眠状态,不进行任何的处理,仅仅是停留在最后一次显示的界面中。当用户点击界面进行操作的时候,激活程序,执行任务,那么runloop可以大概有一下几个作用

    1.保持程序的运行状态
    2.处理app的各种事件
    3.节省cpu的资源,提高程序的性能。该做事的时候,做事,该休息的时候休息
    

    三、runloop的数据结构

    oc中runloop有两套API

    C语言的API CFRunLoopRef ,C语音的runloop 是开源的,下载地址 https://opensource.apple.com/tarballs/CF/
    OC语言的API NSRunLoop,它是对C语言的一层封装,为OC对象
    

    1.runloop的获取方法

    C
    CFRunLoopRef runloop = CFRunLoopGetCurrent();
    OC
    NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop];
    

    2.runloop相关的类

    1.CFRunLoopRef 是C语言的__CFRunLoop结构体类型
    2.CFRunLoopModeRef 是C语言的 __CFRunLoopMode结构体类型,内部包含 source/timer/observer等
    3.CFRunLoopSourceRef 主要用于系统事件
    4.CFRunLoopTimerRef 定时器相关
    5.CFRunLoopObserverRef 通知相关
    

    四、runloop与线程的关系

    1.每条线程都有唯一一个runloop与之对应,保存在一个全局的字典中,以线程为key,runloop为value
    2.runloop是在第一次获取的时候创建,子线程中的runloop默认是没有开启的,因为我们没有获取过它
    3.主线程中的runloop 是已经创建好了,因为在UIApplicationMain入口函数中,获取的时候创建好了
    4.runloop在线程结束的时候销毁
    

    关于runloop更多的内容,还是需要从源码入手。了解更多的runloop知识,深刻理解,有助于开发中,关于runloop的应用。

    相关文章

      网友评论

        本文标题:初识runloop

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