在 iPhone 应用程序上工作了很长时间后,我意识到我的代码很脏,包含几个#import 和根本没有调用或没有用的方法。
我想知道是否有任何编译器指令或方法来检测那些无用的代码行。Xcode 是否有任何工具可以检测到这一点?
在 iPhone 应用程序上工作了很长时间后,我意识到我的代码很脏,包含几个#import 和根本没有调用或没有用的方法。
我想知道是否有任何编译器指令或方法来检测那些无用的代码行。Xcode 是否有任何工具可以检测到这一点?
Xcode 允许您(取消)检查特定编译器警告的设置,这些警告可以警告您某些类型的未使用代码。(选择源列表中的项目,然后选择 File > Get Info,然后选择 Build 选项卡。)这里有一些(对我来说显示为 Clang 和 GCC 4.2)可能感兴趣:
我没有看到任何用于检测未使用的导入的选项,但这有点简单——低技术方法只是注释掉导入语句,直到你得到编译错误/警告。
未使用的 Objective-C 方法比未使用的 C 函数更难检测,因为消息是动态分派的。警告或错误可以告诉您存在潜在问题,但缺少警告或错误并不能保证您不会出现运行时错误。
编辑:检测(可能)未使用方法的另一种好方法是检查实际执行的代码覆盖率。这通常与自动化单元测试一起完成,但并非必须如此。
这篇博文很好地介绍了使用 Xcode 进行单元测试和代码覆盖。关于gcov
(顺便说一下,仅适用于 GCC 生成的代码)的部分解释了如何让 Xcode 构建可以记录执行频率的检测代码。如果您在模拟器中测试应用程序的构建,然后在其上运行 gcov,您可以查看使用CoverStory(相当简单的 GUI)或lcov
(创建 HTML 报告的 Perl 脚本)之类的工具执行了哪些代码.
我使用gcov
和lcov
CHDataStructures.framework并在每次 SVN 提交后自动生成覆盖率报告。同样,请记住,将执行覆盖率视为对哪些代码“死”的明确衡量标准是不明智的,但它肯定有助于确定可以进一步调查的方法。
最后,由于您正在尝试删除死代码,我认为您会发现这个 SO 问题也很有趣:
Appcode有一个代码检查功能,可以发现未使用的导入和代码。
我们一直在使用一些本地开发的 Ruby 代码,现在提取到一个名为 fui 的 gem 中:https ://github.com/dblock/fui
我最近写了一个脚本来查找未使用的(或重复的)#import
语句:https ://gist.github.com/Orangenhain/7691314
该脚本获取一个 ObjC .m 文件并开始依次注释掉每一#import
行并查看项目是否仍然可以编译。您将不得不更改 BUILD_DIR 和 BUILD_CMD。
如果您使用find
命令让脚本在多个文件上运行,请确保使用实际使用所有这些文件的 BUILD_CMD(否则您将看到一个包含许多未使用的导入语句的文件)。
我在不知道 AppCode 具有类似功能的情况下编写了此代码,但是当我测试 AppCode 时,它并没有这个脚本那么彻底(但[对于整个项目] 更快)。
正如paddydub所说,AppCode在这方面做得很好。我试过了,只用了 10 分钟:
转至Code > Optimize Imports...
,或^ + ⌥ + O
这是一个描述如何执行此操作的视频:检测 AppCode 中未使用的导入和方法
您可以使用 Xcode Analyzer 来查找该问题和其他问题。
http://help.apple.com/xcode/mac/8.0/#/devb7babe820
您还可以转到项目和目标构建并在构建设置下添加更改警告首选项。请参阅本指南:
http://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/
最近,我将一个大型项目从 Carbon 更改为 Cocoa。在此结束时,有相当多的孤立文件不再使用。我写了一个脚本来找到他们基本上是这样做的:
确保源代码全部签入到 subversion(即干净) 确保它当前构建没有错误(即 xcodebuild 返回 0 状态) 然后,对于目录中的每个源文件,为空(即删除内容,截断长度)源和头文件,尝试构建,如果失败,恢复文件,否则,将它们留空。
运行此程序后,还原然后删除所有清空的文件,编译然后删除所有错误的#imports。
我还应该补充一点,您需要避免从 .xib 或 .sdef 文件中引用的文件,并且可能还有其他动态链接案例,但它仍然可以让您很好地了解可以删除的内容。
可以使用相同的技术来查看可以删除哪些#imports - 而不是截断文件,而是依次删除文件中的每个#import 并查看构建是否失败。