| name | il-ihuman-inspector |
| description | Objective-C 类代码审查,扫描 Bug、坏味道、内存泄漏、线程风险、语法隐患、重复符号、@optional 专项、KVO/KVC、ARC 桥接、Runtime 安全。触发词:"审查", "review", "代码审查", "扫描", "check code", "code review"。 |
| version | 3.0.0 |
Code Review
对单个 Objective-C 类的全面静态审查,覆盖十大维度。
输入: 一个 .h 或 .m 文件路径
输出: 结构化审查报告,包含问题列表 + 严重度 + 修复建议
前置条件
必须由用户明确指定目标文件。
未指定文件时,先询问确认。
--clear-cache 无需目标文件,直接清缓存并退出。
项目适配
审查前从项目 CLAUDE.md 提取参数,适配不同项目的编码约定。
Step 0: 读取 CLAUDE.md 提取参数
| 参数 | 来源 | 默认值 |
|---|
class_prefix | CLAUDE.md 中的类名前缀约定(如 IL) | nil(无前缀) |
sources_root | 从目标文件路径向上查找含 .podspec 或 Podfile 的目录 | 目标文件所在的 git 仓库根 |
has_code_style | CLAUDE.md 是否引用 CODE_STYLE.md | false |
protocol_convention | CLAUDE.md 中的协议命名规则(如 Name + Protocol/Delegate) | false(不检查) |
提取逻辑:
- 读取项目根 CLAUDE.md(从目标文件路径向上查找)
- 搜索
class_prefix:匹配前缀约定描述(如 "类名必须使用 IL 前缀")→ 提取前缀字符串;未找到则 nil
- 搜索
sources_root:从目标文件目录向上逐级查找 .podspec / Podfile / .xcodeproj → 以找到的目录为根;未找到则使用 git 仓库根
- 搜索
has_code_style:CLAUDE.md 中出现 CODE_STYLE.md 即为 true
- 搜索
protocol_convention:匹配协议命名规则描述 → 提取规则;未找到则 false
完成后进入 Step 1。
审查流程开始时,首先检查是否为 --clear-cache 模式:若是,删除 cache/ 目录下所有 .json 文件,打印 "已清除 N 个缓存文件",直接结束。否则进入 Step 0。
模式
| 模式 | 触发 | 检查维度 | Token 消耗 |
|---|
| Full(默认) | /ihuman-code-inspector <文件> | 全部 10 维 | ~10-20K |
| Quick | /ihuman-code-inspector <文件> --quick | 仅 1-6 维(基础) | ~5-10K |
| Clear | /ihuman-code-inspector --clear-cache | — | 0 |
Quick 模式跳过项:
- 七、@optional 协议专项(减少关联协议读取)
- 八、KVO/KVC 安全
- 九、ARC 桥接
- 十、Runtime 安全
- 对应的交叉搜索 grep 命令
Quick 模式适用于:简单修改自检、小型工具类、无 CF/Runtime/KVO 依赖的纯业务类。
--clear-cache:删除 cache/ 目录下所有 .json 缓存文件。下次审查时全部重新读取源码并生成缓存。
协议缓存
为减少重复读取公共协议头文件,维护本地缓存。
缓存位置
.agents/skills/ihuman-code-inspector/cache/
缓存格式
每个协议一个 JSON 文件,命名:<协议名>.json
{
"protocol": "ILIMEngineDelegate",
"source": "ILClassroomCore/Classes/Service/Engine/IM/ILIMEngineProtocol.h",
"source_mtime": 1716451200.0,
"methods": [
{
"signature": "engine:didReceiveSignalMessage:",
"returnType": "void",
"required": false,
"parameters": [
{"type": "id<ILIMEngineProtocol>", "name": "engine"},
{"type": "ILSignalMessage *", "name": "message"}
]
}
]
}
缓存使用规则
- 审查前先检查
cache/ 目录,命中后比较 source_mtime 与协议源文件的当前 mtime
- mtime 一致 → 跳过读取源码,直接用缓存
- mtime 不一致 → 缓存过期,读取协议源码后自动更新缓存文件(含新 mtime)
- 缓存未命中 → 读取协议源码后自动生成缓存文件(含 mtime)
- 用户通过
--no-cache 强制跳过缓存,全部实时读取
自动缓存策略
不预定义协议白名单。审查时自动发现:扫描目标文件的 #import 和 <> 协议引用,任何协议被当前审查会话引用 2 次以上即自动加入缓存。缓存随项目积累自然增长。
审查维度
| 维度 | 检查项 |
|---|
| Bug 扫描 | nil 消息、参数校验、协议一致性、逻辑错误、回调错误 |
| 坏味道 | 死代码、魔法数字、过长方法、命名违规、遗留 TODO |
| 内存泄漏 | 循环引用、NSTimer、Observer 未移除、CF 对象未释放 |
| 线程风险 | 共享属性无锁、非主线程 UI、block 回调线程不明 |
| 语法隐患 | BOOL/int 混用、浮点比较、nil coalescing 误用、format 参数 |
| 重复符号 | Category 冲突、重复宏、C 函数重名、extern 不匹配 |
| @optional 专项 | respondsToSelector 拼写、@optional 属性、遗漏 callback |
| KVO/KVC 安全 | keyPath 拼写、context 冲突、removeObserver 配对、手动通知 |
| ARC 桥接 | __bridge 误用、CFRelease 配对、CFBridging 所有权 |
| Runtime 安全 | +load 耗时、swizzling 安全、associatedObject 策略、performSelector |
审查流程
Step 1: 读取目标文件 + 对应头文件/协议
目标(.m 文件时):
目标.m — 实现(必须读,不使用缓存)
目标.h — 接口声明(必须读)
- 协议头文件 — 先查
cache/ 目录,命中则用缓存 JSON,未命中则读源码后自动写缓存
- 依赖的外部协议 — 同上,先查缓存
--no-cache 模式下全部实时读取。
Step 2: 代码库交叉搜索
# 检查是否有重复符号 / category 冲突
grep -rn "方法名/类名" {sources_root} --include="*.h" --include="*.m"
# 检查 duplicate symbol 隐患
grep -rn "^@implementation 类名" {sources_root} --include="*.m"
# 检查 extern 声明与实际定义
grep -rn "extern" {sources_root} --include="*.h"
Step 3: 按模式执行检查
Full 模式: 按以下十大维度逐类扫描。
Quick 模式: 仅执行一六维。跳过七十维及其交叉搜索命令。报告中标注 [Quick]。
按以下清单逐类扫描,发现的所有问题汇总到报告中。
一、Bug 扫描
1.1 nil / 参数校验
1.2 协议一致性
1.3 逻辑错误
1.4 API 误用
二、坏味道
2.1 死代码
2.2 代码尺寸
2.3 命名规范
根据 CLAUDE.md 提取的 class_prefix 和 protocol_convention:
2.4 其他
三、内存泄漏
3.1 循环引用
3.2 资源未释放
3.3 其他
四、线程风险
4.1 数据竞争
4.2 主线程
4.3 锁使用
五、语法隐患
5.1 类型混淆
5.2 Block 使用
5.3 防御性编程
六、重复符号
6.1 Category 冲突
6.2 宏定义
6.3 C 函数 / 全局变量
6.4 协议方法
七、@optional 协议专项
ObjC 中 @optional 协议方法调用无编译期检查,需专项审查。
7.1 respondsToSelector: 正确性
7.2 协议实现完整性
7.3 回调链断裂
交叉搜索命令
grep -A 5 "@optional" <protocol.h>
grep -n "respondsToSelector:" <target.m>
八、KVO / KVC 安全
8.1 keyPath 安全
8.2 observer 生命周期
8.3 context 指针
8.4 手动 KVO
交叉搜索命令
grep -n "addObserver:.*forKeyPath:" <target.m>
grep -n "removeObserver:.*forKeyPath:" <target.m>
九、ARC 桥接
IM/信令/音视频 SDK 底层常涉及 Core Foundation 类型(CFDataRef、CFDictionaryRef、CVImageBufferRef 等),需检查桥接安全。
9.1 桥接修饰符
9.2 CF 对象管理
9.3 桥接宏
交叉搜索命令
grep -n "CGCreate\|CFCreate\|CVCreate\|CMCreate\|Sec" <target.m>
grep -n "__bridge\|CFBridging" <target.m>
grep -n "CFRelease\|CVPixelBufferRelease" <target.m>
十、Runtime 安全
10.1 +load 方法
10.2 Method Swizzling
10.3 Associated Objects
10.4 performSelector: 隐患
交叉搜索命令
grep -n "+ (void)load\|class_addMethod\|method_exchangeImplementations\|objc_setAssociatedObject\|performSelector:" <target.m>
grep -rn "class_addMethod\|method_exchangeImplementations\|class_replaceMethod" {sources_root}
| 标记 | 含义 | 示例 |
|---|
| 🔴 严重 | 必然 crash / 逻辑完全错误 | nil 字典 key、循环引用、协议方法调错 |
| 🟡 中等 | 特定条件下出 bug / 潜在性能问题 | 缺少 nil 保护、线程不安全、死代码 |
| 🟢 低 | 不影响运行但降低可维护性 | 魔法数字、TODO 遗留、命名不规范 |
输出格式
## 审查报告: <文件名>
| # | 维度 | 严重度 | 位置 | 问题 |
|---|------|--------|------|------|
---
### 详细说明
**Bug 1: ...**
当前: ...
修改: ...
**坏味道 1: ...**
说明: ...
建议: ...
---
### 汇总
| 维度 | 🔴严重 | 🟡中等 | 🟢低 | 合计 |
|------|--------|--------|------|------|
| Bug 扫描 | ... | ... | ... | ... |
| 坏味道 | ... | ... | ... | ... |
| 内存泄漏 | ... | ... | ... | ... |
| 线程风险 | ... | ... | ... | ... |
| 语法隐患 | ... | ... | ... | ... |
| 重复符号 | ... | ... | ... | ... |
| @optional 专项 | ... | ... | ... | ... |
| KVO/KVC 安全 | ... | ... | ... | ... |
| ARC 桥接 | ... | ... | ... | ... |
| Runtime 安全 | ... | ... | ... | ... |
总计: X 个问题