一个公开、纯 UIKit 的 iOS RunLoop 学习工程。它有 12 个从核心直觉到 CFRunLoop 进阶的学习单元,用紧凑实验控制台、结构化日志、Xcode 调用栈、UI 测试和公开课程页证明观察结果。
App 不承担教材阅读:列表只显示实验名,详情只显示一个目标、真实源码入口、一个 Xcode 动作、运行控件与结果。完整预测、步骤、证据、风险和复盘题都在 docs/。
每个实验都遵循“先预测 → 操作 → 看页面与 Console 日志 → 下断点看调用栈 → 用自己的话解释”的顺序。完整课程地图见 docs/course-map.md,公开站点由同一个 Swift 课程目录导出。
- 核心直觉:Observer、Mode/Timer、主线程阻塞、子线程 Timer。
- 工程诊断:Timer 延迟、CADisplayLink、UI 延迟提交、MainActor/GCD/Task。
- CFRunLoop 进阶:线程生命周期、Source 0、嵌套 RunLoop 反例、Source 1/Port 机制地图。
要求:Xcode 26.2、Swift 6 language mode、iOS 17+ Simulator。
make runmake run 会先构建 App,并尝试启动默认的 iPhone 17 Pro 模拟器;如果本机没有这个模拟器:
make run SIMULATOR_NAME="你的 Simulator 名称"日常验证再跑:
make check
make test-ui
make test-ui-evidence
make release-checkmake check 会运行 Foundation 层测试、课程目录一致性、与具体设备无关的 iOS Simulator Debug 构建、12 个真实源码锚点与操作卡审计、公开站点审计和公开边界扫描。共享 RunLoopLab Scheme 固定使用 LLDB、Main Thread Checker、Queue Debugging 与 View Debugging;Debug 构建显式使用 -Onone 并保留可测试性。UI 测试默认选择与当前 Xcode Simulator SDK 同版本的 runtime,避免 OS=latest 意外切到另一套 runtime。
test-ui-evidence 会创建一次性 Simulator 和独立 DerivedData,以 300 秒整轮 wall-clock 上限显式运行 Debug 配置,并为单个 XCTest 设置 60 秒默认、90 秒最大执行上限。Runner 用精确清单选择 8 个 UI 测试,再从 .xcresult 明细核对这 8 个标识与 8/8、零失败、零跳过;测试前后的 Git HEAD 与 tracked/untracked 非忽略工作树 fingerprint 必须一致。通过后保存 .xcresult、summary、test details、build log 与只含源码指纹、构建配置和聚合结果的 receipt,退出时只删除本轮创建的 Simulator。release-check 依次执行稳定检查、Release generic build 和这条隔离 UI 证据链;它不声称 UI 测试运行的是 Release 配置。
- 第一次只打开「2. Timer:Default 与 Common」:点
1. 启动 Default Timer,持续拖动专用灰色区域,看 Logs;再点2. 启动 Common Timer重复对照。 - Logs 面板支持
Filter和Copy,先复制证据再复述结论,不要靠印象记顺序。 - 在
MainRunLoopProbe.swift的.beforeWaiting/.afterWaiting分支下断点,查看主线程 Call Stack 与当前 Mode。 - 点击「主线程 Stall Episode」后核对 250ms threshold、monotonic delay 与唯一 recovered receipt;再用 Xcode Pause 确认调用链从 UI 事件进入受限
Thread.sleepfixture。 - 对比两个子线程按钮的日志:创建 Timer 不等于线程已经开始消费 Timer 事件。
更完整的操作、预期与验收题见 实验指引,排障路径见 diagnostic-playbook.md,主线程诊断的失败链、证据边界和面试讲法见 Stall Episode 面试证据卡。Stall receipt 只证明本地合成故障的检测合同;它不替代 Instruments、真机 Hang Detection、Xcode Organizer 或线上诊断。工程仅使用本地虚构 UI、公开 API 与公开教学材料,不接入服务、凭证或内部代码。Source 1 只提供资料与结构解释,不伪造不可稳定复现的底层现场。