如何在XCode中查找iOS项目内所有未被使用的方法与变量
iOS老旧项目冗余代码排查方案
该操作完全可以实现,不过需要注意:由于Objective-C支持Runtime动态调用、Swift也存在反射、字符串构造Selector等场景,静态扫描工具无法100%覆盖所有调用场景,扫描结果需要二次校验,避免误删有效代码。
一、Xcode内置工具排查(无需额外安装依赖)
- 开启编译警告直接识别冗余声明
进入项目Build Settings页面,开启以下配置,正常编译后即可在警告列表直接查看未使用的变量、方法、常量:- 搜索
Unused Variables设置为YES - 搜索
Unused Function设置为YES - 搜索
Unused Instance Variables设置为YES - Swift项目额外搜索
Unused Declaration设置为YES
- 搜索
- 通过Link Map文件排查未调用类
- Build Settings中搜索
Write Link Map File设置为YES - 编译项目后在Derived Data对应目录下找到后缀为
.txt的Link Map文件 - 筛选__text段的符号信息,和项目源码列表对比,即可找出从未被链接的冗余类
- Build Settings中搜索
二、第三方静态扫描工具
- AppCode静态分析:
用AppCode打开项目后,点击顶部菜单栏Code -> Inspect Code,选择整个项目扫描,结果中Unused declaration分类会完整列出未被调用的方法、变量、类、协议,同时支持OC和Swift项目,准确率远高于Xcode自带工具。 - fui(Find Unused Imports):
专门针对OC项目排查未使用的头文件,终端进入项目根目录执行fui find即可输出所有无引用的头文件,对应实现类一般也属于可清理的冗余资源。 - Periphery:
Swift项目专用扫描工具,执行扫描命令后会输出未使用的类、结构体、方法、变量、协议,支持自定义忽略测试目标、忽略被@objc标记的声明,大幅降低误判率。
三、二次校验规则(避免误删有效代码)
- 对扫描出的疑似冗余代码,先全局搜索对应方法名、变量名,确认不存在
NSSelectorFromString、performSelector、Swift反射调用等动态调用场景,再进行清理 - 批量清理前可使用Xcode的
Edit -> Refactor -> Rename功能,输入待清理的方法/类名,确认全局无引用后再删除 - 清理完成后跑通所有单元测试、UI测试,覆盖核心业务流程验证功能正常
四、特殊场景注意事项
- 被
#if宏包裹的多环境代码,扫描工具会默认判定为未使用,注意区分不同环境的编译逻辑 - 埋点、动态下发配置关联的方法,可能不存在静态引用,不要直接判定为冗余代码
- 类目(Category)中的方法如果没有被调用,绝大多数扫描工具无法识别,需要手动排查
内容的提问来源于stack exchange,提问作者Shahzaib
相关产品推荐
相关产品推荐

