2010-12-17 30 views
2

警告「[超]可能不[選擇]迴應」我有一個的NSView子類下面的代碼:避免,而不會產生LLVM的「不能投「超級」錯誤

- (id)forwardingTargetForSelector:(SEL)aSelector 
{ 
    if ([super respondsToSelector:@selector(forwardingTargetForSelector:)]) { 
     // cast to (id) to avoid "may not respond to selector" warning 
     return [(id)super forwardingTargetForSelector:aSelector]; 
    } else { 
     [self doesNotRecognizeSelector:aSelector]; 
     return nil; 
    } 
} 

在第一行, return [(id)super ...super轉換爲id,因爲在GCC編譯器下,這抑制了超類(NSView)可能不響應forwardingTargetForSelector:的警告,如answers such as this one中所建議的那樣。

但是,當我切換到LLVM編譯器時,這會導致「Can not cast super」錯誤。有沒有正確的方法來修改我的代碼,以便LLVM和GCC都不會發出警告或錯誤?

+0

真的,gcc在投射超級到id時應該會引發錯誤。 super是一個包含對象和超類指針的結構,因此將它用作id會導致崩潰。 – ughoavgfhw 2010-12-17 21:48:31

回答

7

將選擇器聲明爲實現文件中僅接口的類別。

@interface NSView (FastForwarding) 

- (id) forwardingTargetForSelector:(SEL)selector; 

@end 
+0

這會導致'[superrespondsToSelector:@selector(forwardingTargetForSelector :)]'返回true,即使沒有'forwardingTargetForSelector:'的實現嗎? – Isaac 2010-12-17 20:54:28

+1

No. respondsToSelector:通過檢查匹配實現的類來執行操作。它不知道類別接口,除非你也實現它們。 – ughoavgfhw 2010-12-17 21:47:10

+0

@ughoavgfhw:太棒了。謝謝。 – Isaac 2010-12-17 22:36:19