Как да потискам -Wno-протокол за файл

Имам реализация на Objective-C протокол, който препраща всички методи на протокола към друга цел. Всичко е наред, освен че компилаторът предупреждава, че този клас не прилага метода на протокола. Опитвам се да премахна това предупреждение с помощта на #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'"


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) или можете да посочите настройката за всеки файл в Проект > Цел > Фази на изграждане > Компилиране на източници > Флагове на компилатор = "-Wno-protocol" на Xcode

Аз бих избрал #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