Как подавить -Wno-протокол на файл - PullRequest
3 голосов
/ 01 декабря 2011

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

8 голосов
/ 02 декабря 2011

У вас 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> Фазы сборки> Исходники компиляции> Флаги компилятора = "-Wno-protocol"

Я бы пошел с # 2.

1 голос
/ 21 февраля 2014

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

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

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

1 голос
/ 01 декабря 2011

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

1 голос
/ 01 декабря 2011

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

- (void)test{

}
...