【iOS 开发】RunLoop总结

Runloops是线程相关底层基础的一部分。它的本质和字面意思一样运行着的循环(事件处理的循环)。
作用:接受循环事件和安排线程的工作。
目的:让线程在有任务的时候忙于工作,而没有任务的时候处于休眠状态。

RunLoop概念

Runloop运行循环
iOS中通常所说的Runloop指的是NSRunloop(Foundation框架)或者CFRunloopRef(CoreFoundation框架),CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的一层OC封装。

RunLoop作用

  1. 保持程序的持续运行。
  2. 处理App中的各种事件。(如:touches触摸事件、NSTimer定时器事件、Selector事件)
  3. 节省CPU资源,提高程序性能(有事情就做事情,没事情就休息,资源释放)
  4. 负责渲染屏幕上的所有UI。

RunLoop开启&退出

在UIApplicationMain函数内部开启了一个和主线程相关的RunLoop (保证主线程不会被销毁),导致 UIApplicationMain 不会返回,一直在运行中,也就保证了程序的持续运行。
Runloop 的退出条件:
App退出;线程关闭;设置最大时间到期。

RunLoop和线程关系

  1. 每条线程都有唯一的一个与之对应的Runloop对象。
  2. 主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建。
  3. RunLoop在第一次获取时创建,在线程结束时销毁。
  4. Runloop对象是利用字典来进行存储,Key:线程 Value:线程对应的Runloop。
创建子线程对应的RunLoop

currentRunLoop

RunLoop相关类

  • CFRunLoopRef: RunLoop本身
  • CFRunLoopModeRef: 运行模式
  • CFRunLoopSourceRef: 事件源
  • CFRunLoopTimerRef: Timer事件
  • CFRunLoopObserverRef: 观察者(监听者)
  1. 一条线程 对应一个 Runloop,Runloop 总是运行在某种特定的CFRunLoopModeRef(运行模式)下。

  2. 每个 Runloop 都可以包含若干个 Mode ,每个 Mode 又包含Source源 / Timer事件 / Observer观察者。

  3. 在 Runloop 中有多个运行模式,每次调用 RunLoop 的主函数__CFRunloopRun()时,只能指定其中一个 Mode(称 CurrentMode)运行, 如果需要切换 Mode,只能是退出 CurrentMode 切换到指定的 Mode 进入,目的以保证不同 Mode 下的 Source / Timer / Observer 互不影响。

  4. Runloop 有效,mode 里面 至少 要有一个timer(定时器事件) 或者是source(源)。

Mode
  • kCFRunLoopDefaultMode App的默认Mode,通常主线程是在这个Mode下运行。
  • UITrackingRunLoopMode 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动
  • UIInitializationRunLoopMode 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
  • GSEventReceiveRunLoopMode 接受系统事件的内部 Mode,通常用不到。
  • kCFRunLoopCommonModes 一种模式组合
Source
  • Source0:非基于端口Port的事件(用于用户主动触发的事件,如:点击按钮或点击屏幕)。
  • Source:基于端口Port的事件(通过内核和其他线程互相发送消息)
Timer

NSTimer受RunLoop的Mode影响。GCD定时器不受RunLoop影响。

Observer

消息循环中的监听器

RunLoop休眠

RunLoop 最核心的事情就是保证线程在没有消息时休眠以避免占用系统资源,有消息时能够及时唤醒。 RunLoop 的这个机制完全依靠系统内核来完成,具体来说是苹果操作系统核心组件 Darwin 中的 Mach 来完成的。

最近的文章

Effective Objective-C 2.0(第1章)

编写高质量iOS与OS X代码的52个有效方法第1章 熟悉Objective-C1.了解Objective-C 语言的起源Objective-C使用消息结构messaging structure,而非函数调用function calling。消息结构:运行时所运行的代码是由运行环境决定的。运行时才会 …

Effective Objective-C 2.0 阅读全文
更早的文章

【iOS 开发】Runtime总结

一、Runtime是什么?Runtime 运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。Runtime 基本是用C和汇编编写的。 OC与C语言在函数调用上的区别:C语言: 函数的调用在编译的时候就决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。 C语言在编译阶段调用未实 …

iOS开发 阅读全文