web-dev-qa-db-ja.com

動的転送:不完全な実装の警告を抑制します

いくつかのメソッドを公開するクラスがあり、その実装は内部オブジェクトによって提供されます。

実行時にメソッド呼び出しを内部オブジェクトにディスパッチするためにフォワード呼び出しを使用していますが、宣言されたメソッドの実装が見つからないため、XCodeは文句を言います。

SOで他にも同様の質問がいくつか見つかりましたが、それらはすべて設計変更で解決されました。

ここでデザインについて議論するつもりはありませんが、誰かがそれについて何か提案があれば、コードレビューに 未解決の質問 があります。これはそのような種類の議論により適しています。

私の質問は、XCodeでIncomplete Implementation警告をオフにする方法が存在するかどうかです。

43

追加することでIncomplete Implementation警告を抑制することができます

  #pragma clang diagnostic ignored "-Wincomplete-implementation"

@implementationのすぐ上

お役に立てれば

[〜#〜]編集[〜#〜]

コメントでこれはうまくいかなかったと言われ、理由を見つけた後、彼らが受け取った別の警告だったので、私は少し遊んで、そこで問題を解決することができたので、私はそうするだろうと思いましたこの回答を更新して、彼らの回答を含め、GCCも無視します。したがって、@Tonyの問題については、次のように機能するはずです。

  #pragma clang diagnostic ignored "-Wprotocol"

GCCコンパイラのバージョンを知りたい人にとっては

  #pragma GCC diagnostic ignored "-Wprotocol"

  #pragma GCC diagnostic ignored "-Wincomplete-implementation"

また、これらすべてのdiagnotstic ignoresは、XCODE Project >> Target >> Build Phases >> Compile Sourcesに移動してコンパイラフラグを追加することにより、ファイルごとに設定を指定することによっても実行できるため、-WprotocolまたはWincomplete-implementation、あるいは必要なコンパイラフラグを追加するだけです。

この更新がすべての助けになることを願っています。もう必要な場合は、回答を更新して含めます。

編集2

私はこれについてもう少し掘り下げていて、 Clang Complilerユーザーズマニュアル に出くわしたので、これはまだこの領域で問題を抱えている人にとっては興味深く、役立つだろうと思いました。

また、これらの#pragma diagnostic ignoresを使用できる別の方法を見つけました。つまり、Pushpopを使用できるため、ファイルのすべてではなく特定のセクションだけを無視したい場合は、あなたは次のことができます

    #pragma clang diagnostic Push
    #pragma clang diagnostic ignored "-Wmultichar"

    // And pop the warning is gone.
    char b = 'fa';

    #pragma clang diagnostic pop

これらの#pragmaコンパイル無視はすべてGCCでも使用できるため、上記のようになります。

    #pragma GCC diagnostic Push
    #pragma GCC diagnostic ignored "-Wmultichar"

    // And pop the warning is gone.
    char b = 'fa';

    #pragma GCC diagnostic pop

Pushpopは、これまでに試したすべてのdiagnostic ignoresで機能するようです。

もう一つは

    #pragma clang diagnostic ignored "UnresolvedMessage"
    #pragma GCC diagnostic ignored "UnresolvedMessage"

未使用の変数を抑制するためのものは

    #pragma clang diagnostic Push
    #pragma clang diagnostic ignored "-Wunused-variable"
        NSString *myUnusedVariable;
    #pragma clang diagnostic pop

そしてGCCバージョンは

    #pragma GCC diagnostic Push
    #pragma GCC diagnostic ignored "-Wunused-variable"
        NSString *myUnusedVariable;
    #pragma GCC diagnostic pop

AvailableInDeploymentTargetからの警告を無視するためのもう少し

    #pragma clang diagnostic Push
    #pragma ide diagnostic ignored "UnavailableInDeploymentTarget"
        leftEdge.barTintColor = rightEdge.barTintColor = self.toolbar.barTintColor;
    #pragma clang diagnostic pop

そしてperformSelectorリーク

    #pragma clang diagnostic Push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [target performSelector:cancelAction withObject:Origin];
    #pragma clang diagnostic pop

および非推奨の宣言

    #pragma clang diagnostic Push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        button = [[UIBarButtonItem alloc] initWithTitle:buttonTitle style:UIBarButtonItemStyleBordered target:self action:@selector(customButtonPressed:)];
    #pragma clang diagnostic pop

DanSkeelのおかげで、 ここにリスト全体 を見つけることができます

77
Popeye

クラスカテゴリインターフェイスでメソッドを宣言できます。

@interface MyClass (ForwardedMethods)

- (void)doSomething;

@end

(カテゴリの実装なし)。そうすれば、Xcodeは「不完全な実装」について文句を言うことはもうありません。

26
Martin R