如何在Objective-C中检测未使用的方法和#import

在iPhone应用程序上工作了很长时间之后,我意识到我的代码非常脏,包含几个#import和方法,这些方法根本没有被调用或有用。

我想知道是否有任何编译器指令或方法来检测这些无用的代码行。 Xcode有任何工具来检测这个?

Xcode允许您(un)检查特定编译器警告的设置,这些警告可能会警告您某些types的未使用的代码。 (在源列表中select项目,然后selectFile> Get Info,然后selectBuild选项卡。)下面是一些(对于我来说是Clang和GCC 4.2)

  • 未使用的函数
  • 未使用的参数
  • 未使用的值

我没有看到用于检测未使用的导入的任何选项,但是这有点简单 – 低技术方法只是在导出语句之前注释掉,直到出现编译错误/警告。

未使用的Objective-C方法比未使用的C函数更难以检测,因为消息是dynamic分派的。 警告或错误可以告诉你,你有一个潜在的问题,但缺乏一个不能保证你不会有运行时错误。


编辑:检测(可能)未使用的方法的另一个好方法是从实际执行检查代码覆盖率。 这通常是与自动unit testing一起完成的,但不一定是这样。

这篇博文是使用Xcode进行unit testing和代码覆盖的一个体面的介绍。 关于gcov的部分(顺便说一下,它只适用于GCC生成的代码)解释了如何让Xcode构build可以logging执行次数的仪表代码。 如果你在模拟器中为你的应用程序构build一个模拟版本,然后运行gcov,你可以使用像CoverStory (一个相当简单的GUI)或者lcov (Perl脚本来创buildHTML报告)。

我使用gcovlcov作为CHDataStructures.framework,并在每个SVN提交后自动生成覆盖率报告 。 再一次记住,将执行的覆盖范围作为确定哪些代码“死亡”的确定性措施是不明智的,但它确实有助于确定可以进一步调查的方法。

最后,既然你试图删除死代码,我想你会发现这个有趣的问题:

  • 分析Objective-C二进制图像大小

Appcode具有代码检查function,可以查找未使用的导入和代码。

我们已经使用了一些本土的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有一个类似的function,但是当我testingAppCode的时候,它并没有像这个脚本一样彻底(但是对于整个项目来说却更快)。

正如Paddydub所说, AppCode做得非常好。 我试了一下,只花了10分钟。

转到Code > Optimize Imports... ,或^ + ⌥ + O

以下是描述如何执行此操作的video: 检测AppCode中未使用的导入和方法

您可以使用Xcode分析器来查找和其他问题。

http://help.apple.com/xcode/mac/8.0/#/devb7babe820

您也可以转到项目和目标构build,并在构build设置下添加更改警告首选项。 请参阅本指南:

http://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/

最近,我把一个大项目从Carbon改为Cocoa。 最后,还有不less使用的孤立文件。 我写了一个脚本来find他们基本上这样做:

确保源代码都被检入到颠覆(即干净)确保它当前生成没有错误(即xcodebuild返回0状态)然后,对于目录中的每个源文件,清空(即删除内容,截断长度)源代码和头文件,尝试一个构build,如果失败,恢复文件,否则,将它们留空。

运行后,恢复,然后删除所有清空的文件,编译,然后删除所有错误的#imports。

我还要补充一点,你需要避免从.xib或.sdef文件引用的文件,并且可能还有其他的dynamic链接的情况,但是它仍然可以让你很好的领导什么可以被删除。

可以使用相同的技术来查看哪些#imports可以被删除 – 而不是截断文件,依次删除文件中的每个#import并查看构build是否失败。