我实现了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'”
答案 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没有注意到这一点)。