如何抑制每个文件的-Wno协议

时间:2011-12-01 09:19:04

标签: ios xcode gcc clang gcc-warning

我实现了Objective-C Protocol,它将所有协议的方法转发给另一个目标。 Everething很好,除了编译器警告这个类没有实现协议的方法。我正在尝试使用#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 个答案:

答案 0 :(得分:8)

你有3种直接方法:

1)你可以这样做:

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

指定要使用pragma禁用的组,而不是使用编译器标志来设置/更改。

2)或者您可以像这样更正问题(假设您没有声明根类):

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

3)或者您可以在Xcode的项目&gt;中基于每个文件指定设置。目标&gt;构建阶段&gt;编译源&gt;编译器标志=“-Wno-protocol”

我会选择#2。

答案 1 :(得分:1)

编译器警告此类没有实现协议的方法 - 您没有在此类中实现A协议。将此方法添加到您的班级:

- (void)test{

}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这对我有用:

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

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