2009-08-25 88 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 /#導入行,並檢查它是否仍編譯清理所有多餘的包括,但我沒有得到解決。