2011-12-01 22 views
3

-Wno協議我實現Objective-C的協議,其前所有協議的方法到另一個目標。 Everething沒什麼問題,只是編譯器警告說這個類不執行協議的方法。我試圖使用#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協議’」

回答

8

您已經3點直接的方法:

1)你可以這樣做,而不是:

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

您指定的組使用編譯,而不是編譯器標誌設置爲disable /改變。

2)或可以更正像這樣的問題(假設你沒有聲明根類):

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

3)或者你可以在每個文件的基礎上指定的設置在Xcode的項目>目標>構建階段>編譯源>編譯器標誌=「-Wno-protocol」

我會去#2。

+0

謝謝賈斯汀,但不幸的是#2沒有爲我工作。編譯器仍然警告「不完整的實現」 – iKiR

+0

最後,#1幫助了我,謝謝! – iKiR

+0

我看到 - #2只會減少一些警告。別客氣! – justin

1

編譯器警告說,這一類沒有按執行協議的方法 - 你在這個類中沒有實現A協議。這種方法添加到您的類:

- (void)test{ 

} 
+0

我知道的AIMP1不執行協議的方法本身,但它代表實現這兩個方法到另一個對象,我只是想取消警告 – iKiR

1

如果你轉發從你的對象的方法的另一個目標,那麼你的對象不執行協議 - 目標對象。您需要將目標對象聲明爲實現協議,而不是您的轉發對象。

1

這爲我工作:

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

,只有暫時禁用警告。但看起來對於整個班級的所有協議。我真正喜歡的是僅僅禁用協議的單個方法的警告(它由超類實現,Objective C沒有注意到這一點)。