iOS - RunLoop 基本原理介绍

Runloop是iOS中用于管理事件和消息的对象,通过事件循环在无消息时休眠、有消息时唤醒。它包含不同模式如DefaultMode和TrackingMode,处理Source0、Source1、Observer和Timer等事件。Runloop与线程一一对应,内部结构包括sources、observers和modes等。Runloop的工作流程涉及GCD、Observer状态变化通知、Timer触发以及对MainQueue的处理。Runloop在实际应用中涉及AutoreleasePool、事件响应、手势识别、界面更新和按钮点击等场景。

一、Runloop 简介

Runloop 是通过内部维护事件循环来对事件/消息进行管理的一个对象。

事件循环(状态切换)

  • 没有消息需要处理时,休眠以避免资源占用(用户态 -> 内核态)
  • 有消息需要处理时,立刻被唤醒(内核态 -> 用户态)

事件/消息管理:Runloop 通过 mach_msg() 函数接收、发送消息来进行管理。
请添加图片描述

二、Runloop 数据结构

NSRunloop 是 CFRunloop 的封装,提供了面向对象的 API。

typedef struct __CFRunLoopMode *CFRunLoopModeRef;
struct __CFRunLoopMode {
	// ...
    CFStringRef _name;
    // ...
    CFMutableSetRef _sources0; // <set>
    CFMutableSetRef _sources1; // <set>
    CFMutableArrayRef _observers; // <Array>
    CFMutableArrayRef _times; // <Array>
    // ...
};

// CFRunloop.h 类型重命名
typedef struct __CFRunLoop *CFRunLoopRef;
// CFRunloop.c 结构体
struct __CFRunLoop {
	// ...
    pthread_t _pthread; // runloop 执行线程(runloop 和线程的关系是一一对应)
    // ...
    CFMutableSetRef _commonModes; // <set> String UITrackingRunloopMode / KCFRunloopDefaultMode (一个存储了被标记为 common modes 的模式集合)
    CFMutableSetRef _commonModeItems; // <set> Timer / Observer / Source
    CFRunLoopModeRef _currentMode; // 当前运行的 mode
    CFMutableSetRef _modes; // 内置的 modes
    // ...
};

Runloop 内部存在一个 modes 集合,但 Runloop 只能运行一个 Mode, Runloop 只会处理它当前 Mode 的事件。
请添加图片描述
Runloop 运行模式

  • kCFRunLoopDefaultMode, App的默认运行模式,通常主线程是在这个运行模式下运行
  • UITrackingR
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值