YOU'VE MADE A BRAVE DECISION, WELCOME.

每一个不曾起舞的日子都是对生命的辜负。

RunLoop概念

  • 概述
    • 运行循环
    • 由do-while循环实现
  • 作用
    • 保证程序的持续运行
    • 处理APP的各种事件(滑动,定时器,selector)
    • 节省CPU资源,提高程序性能
    • Foundation
      • NSRunLoop(OC语言)
    • Core Foundation
      • CFRunLoopRef(C语言)
  • 相关类:没有以下类,不会循环

    • CFRunLoopModeRef

      • 代表了RunLoop的运行模式
      • 一个RunLoop可以包含若干个Mode,每个Mode包含若干个Source/Timer/Observe
      • 每次RunLoop启动时,只能指定其中的一个Mode,这个Mode被称作currentMode
      • KCFRunLoopDefaultMode:APP的默认Mode,通常主线程是在该Mode下运行的
      • UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时,不受其他Mode影响
      • UIInitialzationRunLoopMode:在刚启动时APP进入的第一个Mode,启动完成后就不再使用
      • GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常情况下不用
      • KCFRunLoopCommonModes:这是一个占位用的Mode,不是真正的Mode
    • CFRunLoopSourceRef

      • 事件源,也可称之为输入源
      • 按官方文档分类,可分为3类:
        • Port-Based Sources 从其他线程或内核发出的
        • Custome input Sources 自定义的
        • CoCoa Perform Selector Sources
        • 按函数调用栈分类,可分为2类:
          • Sources0:非基于Port类的(点击事件)
          • Sources1:基于Port,通过其他线程或者内核通信,接收,分发系统事件
    • CFRunLoopTimerRef

      • 基于时间的触发器
    • CFRunLoopObserverRef

      • 观察者,能监听RunLoop的状态的改变

      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity){
        KCFRunLoopEntry = (1UL << 0),//即将进入RunLoop
        KCFRunLoopBeforeTimers = (1UL << 1),//即将处理RunLoop
        KCFRunLoopBeforeSources = (1UL << 2),//即将处理Sources
        KCFRunLoopBeforeWaiting = (1UL << 5),//即将进入休眠
        KCFRunLoopAfterWaiting = (1UL << 6),//即将从休眠中唤醒
        KCFRunLoopExit = (1UL << 7),//即将退出RunLoop
        KCFRunLoopAllActivities = OxOFFFFFFFU//活跃中
        };
  • RunLoop与线程
    • 每条线程都有唯一的一个与之对应的RunLoop对象
    • 主线程的RunLoop随着程序已自动创建好,但是子线程的RunLoop需要自动创建
    • 获得主线程的RunLoop的方法是:[NSRunLoop mainRunLoop]
    • 创建子线程RunLoop的方法是:[NSRunLoop currentRunLoop](其中原理可以在CFRunLoop中查看)
    • 苹果不允许创建RunLoop,只提供上述两种获得RunLoop的方法 多线程15_RunLoop_Observer_source