2009-08-25 128 views
4

在处理复杂问题时,我发现自己在尝试各种解决方案,并尽力保持组织性,代码可能会变得非常混乱。对象可能被改变,不再被使用,而其他时候,我可能会添加一些代码片段,这些代码片段最终不会被程序使用,但会占用空间和可能的内存。清理Objective-C代码

除了仔细阅读程序,是否有方法找到程序未使用的代码块?

你有什么技巧可以清理你的程序?

我发现用于检查.h文件中的对象的一个​​小技巧仍然在应用程序中使用,并检查它们是否正确释放/释放是使用“全部搜索”功能(cmd-shift-F)并按对象的名称搜索

+1

鉴于xcode的糟糕的重构支持,我一直面临同样的挑战。有一件事我试图使用可可绑定,并获得一些单元测试覆盖,所以我觉得更安全 – Surya 2009-08-25 15:36:22

回答

5

下面是关于应用程序中的一些方法来报告代码覆盖率的文章:

http://seriot.ch/blog.php?article=20080728

它面向对Mac的应用程序,但主要是适用于iPhone的东西太(DTrace的,你只能在模拟器中使用)

正如文章所述,这是Objective-C中比其他语言更难的问题,因为它很容易拥有performSelector调用的方法,所以静态分析即使被调用也会报告为死代码(是你也可以在Java中做类似的事情,但它是d一个更罕见)。

可能gcc警告标志是最好的主意,以及仔细检查它认为是未调用的方法。实际上,在应用程序中运行所有可能的代码路径实际上是非常困难的,但是如果你有一小部分可能的功能去除,至少你可以更快地做出选择,这样你就不需要测试每条路径......

编辑:我应该很清楚,代码覆盖率是一种技术,你可以用它来找到“死”的代码,这就是你之后

编辑2:链接已死!我无法找到一个缓存版本,并且我不能很好地总结它包含的内容。

+0

链接不再包含文章。 – 2012-01-20 14:57:11

+0

老鼠!我寻找一个缓存版本,但什么都没有找到。感谢您的注意。 – 2012-01-21 01:51:55

3

尽管找到未使用的代码块不一定有帮助,但我发现clang对清理代码和发现潜在问题非常有用。还有一个不错的front-end可用。

+3

也值得记住Clang已与3.2版本的XCode集成在一起,它将于8月28日星期五广泛推出。 – mmc 2009-08-25 15:33:55

1

我有时会发现我的团队中的开发人员删除了他们不再需要的类的引用 - 而不是文件本身。我经常使用'添加现有文件'操作,浏览文件选择器并使用单独的Finder窗口删除'非灰色'孤立的源文件。

+0

是啊,这是一个完整的其他问题,就是将文件组织在查找器的项目文件夹中。这是一个很好的提示。 – Jonah 2009-08-25 15:49:40

2

我知道这不是您正在寻找的答案,但使用源代码管理可能是处理这些情况的最佳方法。当你要做一些重大的重构或者尝试一些棘手的事情时,只需创建一个分支,然后将其合并或丢弃。

2

Xcode的Snapshots功能如何?看起来如果你没有长期保持各种分支,那么这就是要走的路。只需一次关注一个功能,并使其适用于检入。如果您有需要保留的内容,请检入您的源存储库。否则,快照离开并根据需要回滚。如果您真的关心简短的代码片段,请保留一段代码片段库的文本文件。也许在每个片段的评论标题中插入以供后续搜索。

1

我知道这很难,但是如果你希望你的代码在你完成所有“测试出不同的解决方案”时保持高质量,那么恐怕你必须确保你总是评论和/或删除代码随你需要。

如果你考虑一下,这是有道理的。如果你继续改变和重命名东西,那么你必须在清理过程中清理它,或者最后清理它。进入但是无论如何或最后清理是一个艰难的做法。

通常,如果您将其保留到最后,那么只需启动一个新项目并复制有用位就可能更容易。

1

使用源代码控制是一个很大的帮助,因为在捣乱之后,您可以区别源代码以查看更改 - 非常适合查找调试NSLog和其他您忘记添加的快速黑客。

用标记标记临时代码也是一个好主意。我倾向于标记我还没有完成的任何代码。例如,如果我添加了一个IBAction,但还没有写入它,我就让它做NSLog(@“myaction NYI”)。随着我在开发过程中的进展,我偶尔会在NYI的项目中进行搜索,看看是否有人忘记实施。我使用“// NYI delete”标记的临时或黑客调试代码,所以我会记得回来并删除它。

为了删除未使用的代码,我最近编写了一个脚本:检查是否所有内容都已检入,并且它是否干净地构建,然后检查项目中的.h文件并将其清空并关联.c/.cpp/.m/.mm文件,然后进行测试构建。如果它仍然建立,它会继续,否则它会恢复该文件并继续到下一个头文件。剧本结束后,我检查了颠覆状态,看看哪些文件可以摆脱它。我也必须避免资源使用的任何文件。它工作得很好。

我想写一个脚本,通过有史以来的文件,并删除每个#include /#导入行,并检查它是否仍编译清理所有多余的包括,但我没有得到解决。