2012-08-02 37 views
0

這是輕微的從先前的問題遵循:迴應,但不知道?

for(id <stuffieProtocol> eachObject in stuffieArray) { 
    if([eachObject respondsToSelector:@selector(secretID)]) [eachObject secretID]; 
} 

以上是從快速枚舉循環的線,需要一個數字對象的出NSArray和檢查,以查看它們是否該方法響應secretID。方法secretID不是@protocol的一部分,而是在集合中的一個對象上定義的方法。

因爲編譯器說"No known instance method for selector secretID"這很好,id不關心和方法不<stuffieProtocol>定義我可以通過鑄造每個對象的類型,它定義瞭解決這個問題的if上述聲明失敗secretID:

if([eachObject respondsToSelector:@selector(secretID)]) [(Ted *)eachObject secretID]; 

我的問題是在原代碼,編譯器如何知道eachObject響應的方法secretID,但尚未當你問它來調用該方法的說:「沒有已知的方法,」我只是有點好奇的機制?

+0

鑄造成'特德*'讓我不安 - 我寧願投給'id',否則你是隱式記錄,如果對象響應'secretID'則是必須Ted'的'一個實例,這可能並不總是成立,你可能只是試圖通過撒謊來使編譯器沉默。只要編譯器能夠看到聲明該方法的頭文件,就可以轉換爲'id'。你已經導入了一個類來聲明一個方法'secretID'就像你的'Ted'類。 – 2012-08-02 15:06:09

回答

2

編譯器不知道對象是否響應該選擇器,但運行時確實如此。 (即編譯器不執行代碼)。編譯器只關心任何NSObject都可以響應respondsToSelector:

+0

我看到,添加(Ted *)只是告訴編譯器「secretID」在哪裏實現,respondsToSelector:直到運行時纔會起作用。 – fuzzygoat 2012-08-02 13:48:54

相關問題