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


99

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

これらの無用なコード行を検出するコンパイラディレクティブまたは方法があるかどうかを知りたいです。Xcodeにはこれを検出するためのツールはありますか?

回答:


66

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

  • 未使用の機能
  • 未使用のパラメータ
  • 未使用の値

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

未使用のObjective-Cメソッドは、メッセージが動的にディスパッチされるため、未使用のC関数よりも検出がはるかに困難です。警告またはエラーは、潜在的な問題があることを示している可能性がありますが、それがなくてもランタイムエラーが発生しないことは保証されません。


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

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

私が使用gcovしてlcovのためにCHDataStructures.frameworkと自動生成カバレッジ・レポートの各SVNのコミット後。繰り返しになりますが、実行されたカバレッジをどのコードが「デッド」であるかの決定的な尺度として扱うことは賢明ではないことを覚えておいてください。

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


4
あなたの要点がわからない...静的アナライザーは多くの問題を見つけることができますが、として入力された変数にメッセージをディスパッチするidか、実行時に呼び出すセレクターを作成する場合、静的アナライザーは保証できませんコードが本当に使用されていないこと。それでも必要なコードが削除されると、そこにランタイムエラーが発生します。何か不足していますか?
クインテイラー

1
さらに、実行時に文字列に基づいて作成されるセレクターは非常に一般的です。
dreamlax 2009

1
もちろん、動的コードがより強く型キャストされる(つまり、IDの代わりに何かを返す)ことで、動的コードがより適切に提供される場合があります。実行時型付けは、Cocoa / Objective-Cプログラミングの強力なポイントですが、強い型付けについて考えることで、メンテナンスと可読性が向上する場合があります。
alesplin

3
ああ、私は間違いなく同意します。私の経験則では、動的型付けが本当に必要な場合を除いて、静的型付け(Javaの場合と同様)を行います。これはまれですが、ときどき発生します。ただし、Cocoaクラスとのインターフェイス(デリゲートの指定など)だけでは、トレースが困難なダイナミズムと実行パスが発生する可能性があります。実は、実行ループと複数のスレッドを含むプログラムは、重要なものになる可能性があります...
Quinn Taylor



5

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

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

あなたが使用している場合はfind、複数のファイルの上にスクリプトの実行を許可するコマンドを、実際にそのBUILD_CMDを使用してください使用して、すべてのこれらのファイルを(または未使用のimport文のたくさんのファイルが表示されます)。

AppCodeに同様の機能があることを知らずに私はこれを書きましたが、AppCodeをテストしたときは、このスクリプトほど完全ではありませんでした(ただし[プロジェクト全体]の場合)。


これは重複に対してのみ機能し、未使用のインポートは削除されません。
Rahul、2017



1

最近、大規模なプロジェクトをCarbonからCocoaに変更しました。この最後には、使用されなくなった孤立したファイルがかなりありました。私は本質的にこれを行った彼らを見つけるためにスクリプトを書きました:

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.