3

我实现了 Objective-C 协议,它将所有协议的方法转发到另一个目标。一切都很好,除了编译器警告这个类没有实现协议的方法。我正在尝试使用#pragma 诊断来抑制此警告:

//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 的Project > Target > Build Phases > Compile Sources > Compiler Flags = "-Wno-protocol" 中指定每个文件的设置

我会选择#2。

于 2011-12-02T05:15:05.183 回答
1

编译器警告这个类没有实现协议的方法——你没有A在这个类中实现协议。将此方法添加到您的类中:

- (void)test{

}
于 2011-12-01T09:24:37.750 回答
1

如果您将方法从您的对象转发到另一个目标,那么您的对象没有实现协议 - 目标对象是。您需要将目标对象声明为实现协议,而不是您的转发对象。

于 2011-12-01T09:29:24.687 回答
1

这对我有用:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wprotocol"
@implementation ClassName
#pragma clang diagnostic pop

并且只是暂时禁用警告。但似乎适用于整个班级的所有协议。我真正想要的是禁用协议的单个方法的警告(它由超类实现,Objective C 没有注意到这一点)。

于 2014-02-20T23:29:08.463 回答