美文网首页
RunLoop回忆录

RunLoop回忆录

作者: VanChan | 来源:发表于2018-03-14 14:53 被阅读19次

    RunLoop回忆录

    简介

    运行循环, 能够保持程序运行, 处理app的各种事件, 节省CPU资源, 提高性能.

    访问方法

    • NSRunLoop
    • CFRunLoopRef

    CFRunLoopRef是c语言写的, 相比于NSRunLoop更加底层, 所以CFRunLoopRef的性能要更高一点.

    RunLoop与线程

    • 每条线程都有唯一的与之对应的RunLoop对象.
    • 主线程的RunLoop已经创建好了, 而子线程的需要手动创建.
    • RunLoop在第一次获取时创建, 在线程结束时销毁.

    获取RunLoop对象

    Foundation:
    
    [NSRunLoop currentRunLoop]; // 获取当前线程的RunLoop对象
    [NSRunLoop mainRunLoop]; // 获取主线程的RunLoop对象
    
    Core Foundation:
    
    CFRunLoopGetCurrent();
    CFRunLoopGetMain();
    

    RunLoop相关类

    • CFRunLoopRef
    • CFRunLoopModeRef
    • CFRunLoopSourceRef
    • CFRunLoopTimerRef
    • CFRunLoopObserverRef
    1. 一个CFRunLoopModeRef代表的是RunLoop的运行模式
    2. 一个RunLoop包含若干个Mode, 每个Mode又包含若干个Source/Timer/Observer
    3. 每次调用RunLoop的主函数时, 只能指定其中一个Mode, 这个Mode被称作CurrentMode
    4. 如果需要切换Mode, 只能退出RunLoop, 再重新指定一个Mode进入, 这样做是为了分隔开不同组的Source/Timer/Observer, 让其互不影响

    CFRunLoopModeRef

    系统默认注册了4个mode

    kCFRunLoopDefaultMode //App的默认Mode,通常主线程是在这个Mode下运行
    UITrackingRunLoopMode //界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响    UIInitializationRunLoopMode // 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用
    GSEventReceiveRunLoopMode // 接受系统事件的内部 Mode,通常用不到
    kCFRunLoopCommonModes //这是一个占位用的Mode,不是一种真正的Mode
    

    CFRunLoopSourceRef

    是事件源, 分为两种:

    1. source0: 非基于port的(port相当于是系统), 响应
    2. source1: 基于port的, 系统提供的

    CFRunLoopObserverRef

    是观察者, 可以监听RunLoop的状态改变监听的

    RunLoop的应用

    1. performSelector
    2. 常驻线程
    3. NSTimer
    4. ImageVIew的显示, 第三方框架SDWebImage利用了RunLoop
    5. 自动释放池

    相关文章

      网友评论

          本文标题:RunLoop回忆录

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