在iPhone应用程序上工作了很长时间后,我意识到我的代码非常脏,包含几个#import和方法,这些方法根本没有被调用或有用。
我想知道是否有任何编译器指令或方法来检测那些无用的代码行。 Xcode有没有任何工具可以检测到这个?
答案 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
使用gcov
和lcov
,在每次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并查看构建是否失败。