简述RunLoop 的数据结构 ?
参考答案:
RunLoop的数据结构主要涉及到几个核心组成部分。首先,RunLoop本质是一个循环,它确保线程不退出,实现“闲”等待。当有任务时,它会唤醒线程处理任务;无任务时,则让线程休眠。对于开发者而言,RunLoop是一个对象,该对象管理需要处理的事件和消息,并提供一个入口函数来执行循环逻辑。
具体到RunLoop的数据结构,主要包括以下几个部分:
- CFRunLoop:这是RunLoop的核心结构。它由以下元素构成:
- pthread(线程对象):表明RunLoop和线程是一一对应的。
- currentMode(当前所处的运行模式):标识RunLoop当前处于哪种运行模式。
- modes(多个运行模式的集合):包含了RunLoop所有可能的运行模式。
- commonModes(模式名称字符串集合):这是一个模式名称的集合,用于标识某些通用的运行模式。
- commonModelItems:这是一个集合,包含了Observer(观察者)、Timer(定时器)和Source(源)等对象。
- CFRunLoopMode:这代表了RunLoop的一个特定运行模式。它由以下元素组成:
- name:运行模式的名称。
- source0 和 source1:这是两种不同类型的源,分别用于处理不同类型的事件。
- observers:观察者集合,用于监听RunLoop的状态变化。
- timers:定时器集合,用于在特定时间触发任务。
- CFRunLoopSource:这是RunLoop的事件源,分为source0和source1两种。
- source0:即非基于port的,也就是用户触发的事件。这需要手动唤醒线程,将当前线程从内核态切换到用户态。
- source1:基于port的,包含一个mach_port和一个回调。它可以监听系统端口和通过内核与其他线程发送的消息,能主动唤醒RunLoop,接收并分发系统事件。
此外,NSRunLoop是CFRunLoop的封装,它提供了面向对象的API,使得开发者在使用RunLoop时更加便捷和直观。
综上所述,RunLoop的数据结构是一个复杂但有序的系统,它有效地管理了线程的事件和消息处理,保证了程序的正常运行和响应。