102

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

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

4

7 回答 7

67

Xcode 允许您(取消)检查特定编译器警告的设置,这些警告可以警告您某些类型的未使用代码。(选择源列表中的项目,然后选择 File > Get Info,然后选择 Build 选项卡。)这里有一些(对我来说显示为 Clang 和 GCC 4.2)可能感兴趣:

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

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

未使用的 Objective-C 方法比未使用的 C 函数更难检测,因为消息是动态分派的。警告或错误可以告诉您存在潜在问题,但缺少警告或错误并不能保证您不会出现运行时错误。


编辑:检测(可能)未使用方法的另一种好方法是检查实际执行的代码覆盖率。这通常与自动化单元测试一起完成,但并非必须如此。

这篇博文很好地介绍了使用 Xcode 进行单元测试和代码覆盖。关于gcov(顺便说一下,仅适用于 GCC 生成的代码)的部分解释了如何让 Xcode 构建可以记录执行频率的检测代码。如果您在模拟器中测试应用程序的构建,然后在其上运行 gcov,您可以查看使用CoverStory(相当简单的 GUI)或lcov(创建 HTML 报告的 Perl 脚本)之类的工具执行了哪些代码.

我使用gcovlcovCHDataStructures.framework并在每次 SVN 提交后自动生成覆盖率报告。同样,请记住,将执行覆盖率视为对哪些代码“死”的明确衡量标准是不明智的,但它肯定有助于确定可以进一步调查的方法。

最后,由于您正在尝试删除死代码,我认为您会发现这个 SO 问题也很有趣:

于 2009-09-21T21:41:30.753 回答
41

Appcode有一个代码检查功能,可以发现未使用的导入和代码。

于 2013-04-10T02:46:47.257 回答
9

我们一直在使用一些本地开发的 Ruby 代码,现在提取到一个名为 fui 的 gem 中:https ://github.com/dblock/fui

于 2014-01-22T18:30:08.700 回答
5

我最近写了一个脚本来查找未使用的(或重复的)#import语句:https ://gist.github.com/Orangenhain/7691314

该脚本获取一个 ObjC .m 文件并开始依次注释掉每一#import行并查看项目是否仍然可以编译。您将不得不更改 BUILD_DIR 和 BUILD_CMD。

如果您使用find命令让脚本在多个文件上运行,请确保使用实际使用所有这些文件的 BUILD_CMD(否则您将看到一个包含许多未使用的导入语句的文件)。

我在不知道 AppCode 具有类似功能的情况下编写了此代码,但是当我测试 AppCode 时,它​​并没有这个脚本那么彻底(但[对于整个项目] 更快)。

于 2013-11-28T12:52:02.767 回答
5

正如paddydub所说,AppCode在这方面做得很好。我试过了,只用了 10 分钟:

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

这是一个描述如何执行此操作的视频:检测 AppCode 中未使用的导入和方法

于 2014-05-30T13:39:04.330 回答
2

您可以使用 Xcode Analyzer 来查找该问题和其他问题。

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

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

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

于 2016-05-27T08:17:57.407 回答
1

最近,我将一个大型项目从 Carbon 更改为 Cocoa。在此结束时,有相当多的孤立文件不再使用。我写了一个脚本来找到他们基本上是这样做的:

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

运行此程序后,还原然后删除所有清空的文件,编译然后删除所有错误的#imports。

我还应该补充一点,您需要避免从 .xib 或 .sdef 文件中引用的文件,并且可能还有其他动态链接案例,但它仍然可以让您很好地了解可以删除的内容。

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

于 2009-09-23T01:11:00.097 回答