web-dev-qa-db-ja.com

Objective-Cで未使用のメソッドと#importを検出する方法

IPhoneアプリで長い間働いた後、私は自分のコードがかなり汚いことに気付きました。いくつかの#importと、まったく呼び出されない、またはまったく役に立たないメソッドが含まれています。

コンパイラ指令またはこれらの無駄なコード行を検出する方法があるかどうかを知りたいです。 Xcodeにはこれを検出するツールがありますか?

98
Hectoret

Xcodeを使用すると、特定のコンパイラの警告の設定を(非)チェックして、一部の種類の未使用コードについて警告することができます。 (ソースリストでプロジェクトを選択し、[ファイル]> [情報を見る]を選択してから、[ビルド]タブを選択します。)興味深いものをいくつか紹介します(ClangおよびGCC 4.2に表示されます)。

  • 未使用の関数
  • 未使用のパラメーター
  • 未使用の値

未使用のインポートを検出するためのオプションはありませんが、それは少し簡単です。ローテクのアプローチは、コンパイルエラー/警告が表示されるまでインポートステートメントをコメントアウトすることです。

未使用のObjective-Cメソッドは、メッセージが動的にディスパッチされるため、未使用のC関数よりも検出がはるかに困難です。警告またはエラーは、潜在的な問題があることを伝えることができますが、それがないからといって、実行時エラーがないことを保証するものではありません。


Edit:(潜在的に)未使用のメソッドを検出する別の良い方法は、実際の実行からコードカバレッジを調べることです。これは通常、自動化された単体テストと並行して行われますが、そうである必要はありません。

このブログ投稿 は、Xcodeを使用した単体テストとコードカバレッジの適切な紹介です。 gcov(ちなみにGCCによって生成されたコードでのみ動作します)のセクションでは、Xcodeを使用してインストルメント済みコードをビルドする方法を説明しています実行された頻度を記録できます。シミュレーターでスピンするためにアプリのインストルメントビルドを取得してからgcovを実行すると、 CoverStory (かなり単純なGUI)または-のようなツールを使用して実行されたコードを確認できます lcov (HTMLレポートを作成するPerlスクリプト)。

CHDataStructures.frameworkgcovlcovを使用し、各SVNのコミット後に カバレッジレポート を自動生成します。繰り返しますが、実行されたカバレッジを「デッド」コードの決定的な尺度として扱うことは賢明ではありませんが、さらに調査できるメソッドを特定するのに役立つことは間違いありません。

最後に、デッドコードを削除しようとしているので、このSOの質問も興味深いものになると思います。

66
Quinn Taylor

Appcode には、未使用のインポートとコードを検出するコード検査機能があります。

38
patrickandroid

自家製のRubyコードを使用して、fuiというgemに抽出されました: https://github.com/dblock/fui

8
dB.

最近、未使用(または重複)を見つけるスクリプトを作成しました#importステートメント: https://Gist.github.com/Orangenhain/7691314

このスクリプトはObjC .mファイルを受け取り、各#import行を順番に見て、プロジェクトがまだコンパイルされるかどうかを確認します。 BUILD_DIRとBUILD_CMDを変更する必要があります。

findコマンドを使用してスクリプトを複数のファイルで実行する場合は、実際にusesを使用するBUILD_CMDを使用してください。ファイル(または、多くの未使用のインポートステートメントを含むファイルが表示されます)。

私はAppCodeに同様の機能があることを知らずにこれを書きましたが、AppCodeをテストしたとき、このスクリプトほど徹底的ではありませんでした(しかし(プロジェクト全体で)より高速です)。

5
Orangenhain

paddydubが言ったように、AppCodeはこれを非常にうまくやる。試しましたが、たった10分で完了しました。

Code > Optimize Imports...または^ + ⌥ + Oに移動します

これを行う方法を説明するビデオは次のとおりです。 AppCodeの未使用のインポートとメソッドの検出

2
Erzékiel

Xcode Analyzerを使用して、その問題やその他の問題を見つけることができます。

http://help.Apple.com/xcode/mac/8.0/#/devb7babe82

また、プロジェクトとターゲットビルドに移動し、ビルド設定の下に変更警告設定を追加できます。このガイドを参照してください:

http://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/

2
sivi

最近、大規模なプロジェクトをCarbonからCocoaに変更しました。この最後に、使用されなくなった孤立したファイルがかなりありました。基本的にこれを実行するスクリプトを作成しました。

ソースがすべてSubversionにチェックインされていること(クリーン)を確認します。現在エラーなしでビルドされていることを確認します(xcodebuildは0ステータスを返します)。ソースとヘッダーファイル、ビルドが失敗した場合は、ファイルを元に戻すか、そうでない場合は空のままにしてください。

これを実行した後、すべての空のファイルを元に戻してから削除し、コンパイルしてからすべてのエラーのある#importを削除します。

また、追加する必要があります。xibまたは.sdefファイルから参照されるファイルを避ける必要があります。また、他の動的リンクのケースがあるかもしれませんが、それでも削除できるものについて良いリードを与えることができます。

同じ手法を使用して、どの#importsを削除できるかを確認できます。ファイルを切り捨てる代わりに、ファイル内の各#importを順番に削除し、ビルドが失敗するかどうかを確認します。

1
Peter N Lewis