深入浅出 RunLoop(一):初识

  • 运行循环,在程序运行过程中循环做一些事情(如接收消息、处理消息、休眠等待等);
  • RunLoop 是通过内部维护的事件循环来对事件/消息进行管理的一个对象;
  • RunLoop 不是一个简单的 do...while 循环,它涉及到用户态和内核态之间的切换。

事件循环

事件循环就是对事件/消息进行管理,事件循环可以达到:

mach_msg()

RunLoop 的基本作用

  • 保持程序的持续运行:
    如果没有 RunLoopmain() 函数一执行完,程序就会立刻退出。
    而我们的 iOS 程序能保持持续运行的原因就是在 main() 函数中调用了 UIApplicationMain 函数,这个函数内部会启动主线程的 RunLoop
  • 处理 App 中的的各种事件(比如触摸事件、定时器事件等);
  • 节省 CPU 资源,提高程序性能:该做事时做事,该休息时休息。

RunLoop 的应用范畴

  • 定时器(Timer)、PerformSelector
  • GCD:dispatch_async(dispatch_get_main_queue(), ^{ });
  • 事件响应、手势识别、界面刷新
  • 网络请求
  • AutoreleasePool

RunLoop 对象

  • iOS 中有 2 套 API 来访问和使用 RunLoop
    ① Foundation: NSRunLoop (是 CFRunLoopRef 的封装,提供了面向对象的 API)
    ② Core Foundation: CFRunLoopRef
  • NSRunLoopCFRunLoopRef 都代表着 RunLoop 对象
  • NSRunLoop 不开源,而 CFRunLoopRef 是开源的: Core Foundation 源码
  • 获取 RunLoop 对象的方式:
// Foundation
    [NSRunLoop mainRunLoop];     // 获取主线程的 RunLoop 对象
    [NSRunLoop currentRunLoop];  // 获取当前线程的 RunLoop 对象
    // Core Foundation
    CFRunLoopGetMain();     // 获取主线程的 RunLoop 对象
    CFRunLoopGetCurrent();  // 获取当前线程的 RunLoop 对象
复制代码
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章