2011-09-21 29 views
0

我想寫一個自定義的,正式的協議,我遇到了Xcode的警告問題。具體做法是:使用正式協議時,刪除「NSObject可能不會響應選擇器」警告?

if([self.delegate conformsToProtocol:@protocol(myProtocol)]){ 
    [self.delegate myProtocolMethod]; 
} 

這在運行時工作完全正常,但Xcode中不斷給我的「NSObject的可能不響應-myProtocolMethod」的警告。我真的想刪除警告,所以我在這裏做錯了什麼?

回答

5

編譯器不關心你是否檢查了協議。它只關心你正在調用方法的對象的數據類型。最簡單的做法是簡單地將self.delegate的結果轉換爲聲明協議的類型。

if([self.delegate conformsToProtocol:@protocol(myProtocol)]) { 
    [(NSObject * <myProtocol>)self.delegate myProtocolMethod]; 
} 

或者,如果委託物業應該總是實現此協議,您可以更改屬性聲明包含它。這更好,因爲如果您嘗試將不實現協議的對象指定爲委託,編譯器會警告您。

@property (modifiers) NSObject * <myProtocol> delegate; 
+3

我一般推薦在這裏使用'id'而不是'NSObject'。然後確保''繼承自''。這允許'NSProxy'對象正常工作。當然,總是用頂端的帽子命名協議。 –

+0

@RobNapier我打算使用'id',但由於OP的錯誤提到了'NSObject',我想我應該使用它。雖然好點。 – ughoavgfhw

+0

這應該是編譯器檢查的小菜一碟,不是嗎?我的意思是,如果它是一個** Objective C **編譯器,它就是......現在它的行爲就像一個C/C++編譯器。 石膏是危險的。 –

3

你所看到的警告,因爲的self.delegate類型,不管它恰好是,不聲明該方法。

self.delegate轉換爲正確的類或協議以刪除警告。例如:

[(id<myProtocol>)self.delegate myProtocolMethod]; 
相關問題