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

时间:2009-09-21 21:25:18

标签: objective-c xcode methods compiler-warnings

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

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

7 个答案:

答案 0 :(得分:66)

Xcode允许您(取消)检查特定编译器警告的设置,这些警告可以警告您某些类型的未使用代码。 (在源列表中选择项目,然后选择文件>获取信息,然后选择构建选项卡。)以下是一些可能感兴趣的(适用于Clang和GCC 4.2):

  • 未使用的功能
  • 未使用的参数
  • 未使用的值

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

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


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

This blog post是使用Xcode进行单元测试和代码覆盖的一个不错的介绍。关于 gcov 的部分(仅适用于GCC生成的代码),解释了如何让Xcode构建可以记录执行频率的检测代码。如果您在模拟器中进行应用程序的检测构建,然后在其上运行gcov,您可以使用CoverStory(相当简单的GUI)或{{3}之类的工具查看执行了哪些代码(用于创建HTML报告的Perl脚本)。

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

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

答案 1 :(得分:36)

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

答案 2 :(得分:8)

我们一直在使用一些本土的Ruby代码,现在被提取到一个名为fui的宝石中:https://github.com/dblock/fui

答案 3 :(得分:5)

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

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

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

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

答案 4 :(得分:2)

正如 paddydub 所说, AppCode 做得非常好。我试过了,我花了10分钟:

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

以下是介绍如何执行此操作的视频:Detection of unused import and methods in AppCode

答案 5 :(得分:2)

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

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

此外,您可以转到项目并定位构建并在构建设置下添加更改警告首选项。请参阅本指南:

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

答案 6 :(得分:1)

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

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

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

我还应该补充一点,您需要避免从.xib或.sdef文件引用的文件,并且可能存在其他动态链接案例,但它仍然可以为您提供可删除内容的良好引导。

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