Как подавить -Wno-протокол для каждого файла

У меня есть реализация протокола 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""


person iKiR    schedule 01.12.2011    source источник


Ответы (4)


У вас есть 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.

person justin    schedule 02.12.2011
comment
Спасибо, Джастин, но, к сожалению, № 2 у меня не работает. компилятор все еще предупреждает о неполной реализации - person iKiR; 05.12.2011
comment
я вижу - # 2 уменьшит только некоторые предупреждения. пожалуйста! - person justin; 06.12.2011

компилятор предупреждает, что этот класс реализует метод протокола - у вас нет реализации для A протокола в этом классе. Добавьте этот метод в свой класс:

- (void)test{

}
person beryllium    schedule 01.12.2011
comment
Я знаю, что Aimpl не реализует сам метод протокола, но делегирует реализацию этих методов другому объекту, и я просто хочу подавить предупреждение - person iKiR; 02.12.2011

Если вы перенаправляете метод из своего объекта в другую цель, то ваш объект не реализует протокол, а целевые объекты. Вам нужно объявить целевые объекты как реализующие протокол, а не ваш объект пересылки.

person Jasarien    schedule 01.12.2011

Это сработало для меня:

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

и только временно отключает предупреждение. Но вроде бы для всех протоколов для всего класса. Что бы я действительно хотел, так это отключить предупреждение только для одного метода протокола (оно реализовано суперклассом, и Objective C этого не замечает).

person Chris Prince    schedule 20.02.2014