深刻浅出 RunLoop(一):初识

RunLoop 系列文章

深刻浅出 RunLoop(一):初识
深刻浅出 RunLoop(二):数据结构
深刻浅出 RunLoop(三):事件循环机制
深刻浅出 RunLoop(四):RunLoop 与线程
深刻浅出 RunLoop(五):RunLoop 与 NSTimer
深刻浅出 RunLoop(六):相关面试题html

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 对象
复制代码

RunLoop 在实际开发中的应用

  • 使用端口或自定义输入源与其余线程进行通讯
  • 在子线程上使用定时器
  • 解决NSTimer在滑动时中止工做的问题
  • 控制线程的生命周期,实现一个常驻线程
  • 在 Cocoa 应用程序中使用任何performSelector...方法
  • 监控应用卡顿
  • 性能优化
  • ......

相关连接

Core Foundation 源码
苹果官方文档 RunLoop性能优化

相关文章
相关标签/搜索