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


99

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

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

Answers:


66

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

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

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

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


编辑:检测(潜在)未使用方法的另一种好方法是从实际执行中检查代码覆盖率。通常,这与自动单元测试协同进行,但不是必须如此。

这篇博客文章很好地介绍了使用Xcode进行单元测试和代码覆盖。上的部分gcov(仅与GCC生成的代码一起使用)说明了如何使Xcode生成可记录执行频率的检测代码。如果您在模拟器中使用经过测试的应用构建版本,然后在其上运行gcov,则可以使用CoverStory(一种相当简单的GUI)或lcov(Perl脚本来创建HTML报告)之类的工具来查看执行了哪些代码。。

我在每次SVN提交后都使用gcovlcov用于CHDataStructures.framework并自动生成覆盖率报告。再次提醒您,将执行覆盖率作为确定哪些代码“死机”的绝对度量是不明智的,但它无疑可以帮助您确定可以进一步研究的方法。

最后,由于您正在尝试删除无效的代码,因此我认为您也会发现这样的SO问题:


4
我不确定您的意思是什么...静态分析器会发现很多问题,但是如果您将消息分派给类型为的变量id或创建选择器以在运行时调用,则静态分析器无法保证该代码是真正未使用的。如果仍然需要的代码被删除,那将是运行时错误的地方。我想念什么吗?
奎因·泰勒

1
此外,在运行时基于字符串创建的选择器非常普遍。
dreamlax

1
当然,在某些情况下,最好通过强类型转换(即返回某些内容而不是ID)来更好地提供动态代码。运行时键入是Cocoa / Objective-C编程的强项,但是有时,通过更多地考虑强类型,可以更好地维护和提高可读性。
alesplin

3
哦,我绝对同意。我的经验法则是静态键入(就像我在Java中那样),除非我真的需要动态键入,这种情况很少见,但有时会发生。但是,仅与Cocoa类交互(例如,指定委托)可能导致难以追踪的动态性和执行路径。哎呀,任何具有运行循环和多个线程的程序都是不简单的……
Quinn Taylor



5

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

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

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

我在编写此代码时并不知道AppCode具有类似的功能,但是当我测试AppCode时,它不如该脚本那么详尽(但对于整个项目而言,速度要快得多)。


它仅适用于重复项,不会删除未使用的导入。
拉胡尔



1

最近,我将一个大型项目从Carbon更改为Cocoa。最后,有许多不再使用的孤立文件。我编写了一个脚本来查找本质上是这样做的:

确保将源全部签入到Subversion中(即清除)确保其当前正在生成且没有错误(即xcodebuild返回0状态)。然后,对于目录中的每个源文件,将其清空(即删除内容,截断长度)源和头文件,请尝试构建,如果失败,请还原文件,否则,将它们留空。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.