清理Objective-C代码

时间:2009-08-25 15:24:43

标签: iphone objective-c memory-management

在处理复杂问题时,我发现自己正在尝试各种解决方案,并且在尽力保持井井有条的情况下,代码可能会变得非常混乱。对象可能会被更改,不再有用,而有时我可能会添加一些代码片段,这些代码片段最终不会被程序使用,但会占用空间并占用内存。

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

您在清理程序方面有哪些提示?

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

7 个答案:

答案 0 :(得分:5)

这是一篇关于在您的应用程序中报告代码覆盖率的几种方法的文章:

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

它面向Mac应用程序,但大多数也适用于iPhone的东西(DTrace只能在模拟器中使用)

正如文章所指出的,这是Objective-C中比其他语言更难的问题,因为使用performSelector调用的方法很容易,即使调用了静态分析也会报告死代码(是的,你是也可以在Javabut做类似的事情,这很少见。)

可能gcc警告标志是最好的主意,同时仔细检查它认为是不必要的方法。实际上在应用程序中运行每个可能的代码路径实际上非常困难,但如果你有一组较小的可能函数要删除,至少你可以更快地做出选择,这样你就不必测试每条路径......

编辑:我应该说明代码覆盖率是一种可以用来查找“死”代码的技术,这就是你所追求的

EDIT2:链接已经死了!我找不到一个缓存版本,我记不清楚它是否足以概括它包含的内容。

答案 1 :(得分:3)

虽然不一定有助于查找未使用的代码块,但我发现clang非常有用,可以清理代码并发现潜在的问题。还有一个很好的front-end可用。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

Xcode中的Snapshots功能怎么样?看起来如果你不长期保持各种分支,那么这就是你要走的路。只需一次关注一个功能并使其正常工作并适合签入。如果您需要保留某些内容,请检查您的源存储库。否则快照离开并根据需要回滚。如果您真的关心代码的短片段,请保留代码片段库的文本文件。可能会在每个代码段的注释标题中插入以供稍后搜索。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我知道这很难,但是当你完成所有“测试不同的解决方案”时,如果你希望你的代码质量,我担心你必须确保你总是评论和/或删除你不需要的代码你走了。

如果你仔细想想,这是有道理的。如果你继续改变和重命名的东西,你要么必须随时清理它,或者最后清理它。这是一个艰难的做法,但它要么进入,要么最后清理。

通常,如果你把它留到最后,那么开始一个新项目并复制有用位可能会更容易。

答案 6 :(得分:1)

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

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

为了删除未使用的代码,我最近编写了一个脚本:检查所有内容都已签入并且构建得很干净,然后在项目中查看了所有.h文件并清空了它及其相关的.c / .cpp /。 m / .mm文件,然后进行测试构建。如果它仍然构建,它继续,否则它还原该文件并继续到下一个头文件。脚本完成后,我检查了subversion状态,看看它认为我可以摆脱哪些文件。我还必须避免资源使用的任何文件。它工作得很好。

我想编写一个遍历文件的脚本并删除每个#include / #import行并检查它是否仍然编译以清除所有多余的包含,但我还没有解决这个问题。

相关问题