name: ios-chaos-monkey description: 适用于iOS 26 / Swift 6.2诊所架构代码库的崩溃猎人技能,使用TDD发现和修复并发、内存和I/O错误。覆盖数据竞争、演员隔离、保留周期、SwiftData上下文误用以及在Domain/Data/App边界中的同步相关故障。在调试ios-*和swift-*诊所模块中的崩溃或难以复现的故障时使用。
iOS混沌猴 — 崩溃猎人最佳实践
适用于iOS和Swift应用程序的对抗性崩溃狩猎指南。包含8个类别中的47条规则,按崩溃严重性优先排序。每条规则遵循TDD:先写危险代码,再写证明bug的失败测试,然后修复使测试通过。
诊所架构契约(iOS 26 / Swift 6.2)
本技能中的所有指导均基于诊所模块化MVVM-C架构:
- 功能模块仅导入
Domain和DesignSystem(从不导入Data,从不导入同级功能) - 应用程序目标是汇聚点,并拥有
DependencyContainer、具体协调器和路由外壳接线 Domain保持纯Swift,并定义模型以及存储库、*Coordinating、ErrorRouting和AppError契约Data拥有SwiftData/网络/同步/重试/后台I/O并实现Domain协议- 读写流默认使用陈旧-同时-重新验证读取和乐观队列写入
- ViewModels直接调用存储库协议(无默认用例/交互器层)
何时应用
在以下情况下参考这些指南:
- 在Swift中狩猎数据竞争、死锁和并发崩溃
- 审计内存管理以查找保留周期和释放后使用
- 审查async/await代码以查找取消和续体泄漏
- 压力测试文件I/O和CoreData/SwiftData持久化层
- 在实施修复前编写崩溃证明测试
按优先级分类的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 数据竞争与线程安全 | 严重 | race- |
| 2 | 内存损坏与泄漏 | 严重 | mem- |
| 3 | 死锁与线程饥饿 | 高 | dead- |
| 4 | 异步/等待与结构化并发 | 高 | async- |
| 5 | 文件I/O与持久化损坏 | 中高 | io- |
| 6 | 集合与状态突变 | 中 | mut- |
| 7 | 资源耗尽 | 中 | exhaust- |
| 8 | Objective-C互操作陷阱 | 低中 | objc- |
快速参考
1. 数据竞争与线程安全(严重)
race-dictionary-concurrent-write- 并发字典突变导致EXC_BAD_ACCESS崩溃race-array-concurrent-append- 并发数组追加损坏内部缓冲区race-property-access- 跨线程未同步的属性读写race-lazy-initialization- 并发下的延迟属性双重初始化race-singleton-initialization- 非原子单例暴露部分构造状态race-bool-flag- 非原子布尔标志创建检查后执行竞争race-closure-capture-mutation- 闭包跨线程捕获可变引用race-delegate-nilification- 委托在活动回调期间设为nil
2. 内存损坏与泄漏(严重)
mem-closure-retain-cycle- 逃逸闭包中的强自引用创建保留周期mem-timer-retain-cycle- 计时器保留目标创建不可发现的保留周期mem-delegate-strong-reference- 强委托引用阻止释放mem-unowned-crash- 未拥有引用在所有者释放后崩溃mem-notification-observer-leak- NotificationCenter观察者在移除后仍保留闭包mem-combine-sink-retain- Combine接收器未存储可取消对象而保留自引用mem-async-task-self-capture- 任务捕获自引用延长生命周期超出预期范围
3. 死锁与线程饥饿(高)
dead-sync-on-main- 从主线程执行DispatchQueue.main.sync立即死锁dead-recursive-lock- 在同一串行队列上的递归锁获取dead-actor-reentrancy- 演员可重入性产生意外交错dead-semaphore-in-async- 异步上下文中的Semaphore.wait()死锁线程池dead-queue-hierarchy- 调度队列目标层次倒置死锁dead-mainactor-blocking- 用同步繁重工作阻塞MainActor
4. 异步/等待与结构化并发(高)
async-missing-cancellation- 缺少Task.isCancelled检查在导航后浪费资源async-detached-task-leak- 未取消句柄的分离任务泄漏工作async-task-group-error- TaskGroup静默丢弃子任务错误async-continuation-leak- CheckedContinuation从未恢复泄漏等待任务async-actor-hop-starvation- 热循环中过度MainActor跳转导致UI更新饥饿async-unsafe-sendable- @unchecked Sendable隐藏编译器的数据竞争
5. 文件I/O与持久化损坏(中高)
io-concurrent-file-write- 并发文件写入未经协调损坏数据io-coredata-cross-thread- CoreData NSManagedObject从错误线程访问io-swiftdata-background- SwiftData模型从错误ModelContext访问io-plist-concurrent-mutation- UserDefaults并发读写产生陈旧值io-filemanager-race- FileManager存在检查后使用是TOCTOU竞争io-keychain-thread-safety- 从多个线程访问Keychain返回意外错误
6. 集合与状态突变(中)
mut-enumerate-and-mutate- 枚举期间集合突变在运行时崩溃mut-kvo-dealloc-crash- KVO观察者在释放前未移除导致崩溃mut-index-out-of-bounds- 数组索引访问未边界检查崩溃mut-force-unwrap- 生产中强制解包可选值在nil时崩溃mut-enum-future-cases- 非穷举switch在未知枚举情况上崩溃
7. 资源耗尽(中)
exhaust-unbounded-task-spawn- 循环中无限制任务生成耗尽内存exhaust-thread-explosion- GCD在并发负载下创建无限制线程exhaust-urlsession-leak- URLSession未失效泄漏委托和连接exhaust-file-descriptor-leak- 文件句柄未关闭泄漏文件描述符exhaust-memory-warning-ignored- 低内存警告被忽略触发Jetsam终止
8. Objective-C互操作陷阱(低中)
objc-unrecognized-selector- 缺少@objc注释导致无法识别选择器崩溃objc-nsnull-in-json- 解码JSON集合中的NSNull在访问时崩溃objc-bridge-type-mismatch- Swift/ObjC桥接类型不匹配在运行时崩溃objc-dynamic-dispatch- 缺少dynamic关键字破坏方法交换
如何使用
阅读单个参考文件以获取详细解释和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |