3

すべてのプロトコルのメソッドを別のターゲットに転送する Objective-C プロトコルの実装があります。このクラスがプロトコルのメソッドを実装していることをコンパイラが警告することを除いて、エベレシングは問題ありません。#pragma diagnostic を使用してこの警告を抑制しようとしています:

//Header file
@protocol A
-(void)test;
@end

@interface AImpl : NSObject<A> {
    id<A> myItems;
}
@end

//Implementation file:
#pragma GCC diagnostic push
#pragma clang diagnostic push

#pragma GCC diagnostic ignored "-Wno-protocol"
#pragma clang diagnostic ignored "-Wno-protocol"

@implementation AImpl
- (void)forwardInvocation:(NSInvocation *)invocation {
SEL selector = [invocation selector];

    if ([myItems respondsToSelector:selector]) {
    [invocation invokeWithTarget:myItems];
} else {
    [super forwardInvocation:invocation];
}
}
@end

#pragma clang diagnostic pop
#pragma GCC diagnostic pop

しかし、コンパイラは「不明な警告グループ '-Wno-protocol'」と警告します

4

4 に答える 4

8

あなたは3つの即時のアプローチを持っています:

1)代わりにこれを行うことができます:

#pragma GCC diagnostic ignored "-Wprotocol"
#pragma clang diagnostic ignored "-Wprotocol"

設定/変更するコンパイラフラグではなく、プラグマを使用して無効にするグループを指定します。

2)または、そのように問題を修正できます(ルートクラスを宣言していないと仮定します):

@interface AImpl : NSObject<A>
{
  id<NSObject,A> myItems;
}
@end

3)または、Xcodeのプロジェクト>ターゲット>ビルドフェーズ>ソースのコンパイル>コンパイラフラグ="-Wno-protocol" でファイルごとに設定を指定できます。

私は#2で行きます。

于 2011-12-02T05:15:05.183 に答える
1

オブジェクトから別のターゲットにメソッドを転送している場合、オブジェクトはプロトコルを実装していません-ターゲットオブジェクトは実装しています。転送オブジェクトではなく、ターゲット オブジェクトをプロトコルの実装として宣言する必要があります。

于 2011-12-01T09:29:24.687 に答える
1

コンパイラは、このクラスがプロトコルのメソッドを実装していないことを警告しますA。このクラスにはプロトコルの実装がありません。このメソッドをクラスに追加します。

- (void)test{

}
于 2011-12-01T09:24:37.750 に答える