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

Hec*_*ret 98 methods xcode objective-c compiler-warnings

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

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

Qui*_*lor 66

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

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

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

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


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

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

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

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

  • 我不确定你的观点是什么......静态分析器可以发现很多问题,但是如果你将一个消息发送到一个类型为**`id`**的变量,或者创建一个在运行时调用的选择器,静态分析器无法保证代码真正未使用.如果删除了仍然需要的代码,那么就会出现运行时错误.我错过了什么吗? (4认同)
  • 哦,我绝对同意.我的经验法则是静态输入(就像在Java中一样),除非我真的需要动态类型,这种情况很少见,但有时会发生.但是,只是与Cocoa类接口(例如,指定委托)可能导致难以跟踪的动态和执行路径.哎呀,任何带有运行循环和多线程的程序都可能非常重要...... (3认同)

pat*_*oid 38

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

  • 那么,你的意思是我们应该为这个功能安装Appcode吗? (14认同)

dB.*_*dB. 8

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


Ora*_*ain 5

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

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

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

我写这篇文章时不知道AppCode有类似的功能,但是当我测试AppCode时,它并不像这个脚本那么彻底(但是对于整个项目来说速度更快).


Erz*_*iel 5

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

前往Code > Optimize Imports...,或^ + ? + O

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