這是輕微的從先前的問題遵循:迴應,但不知道?
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
,但尚未當你問它來調用該方法的說:「沒有已知的方法,」我只是有點好奇的機制?
鑄造成'特德*'讓我不安 - 我寧願投給'id',否則你是隱式記錄,如果對象響應'secretID'則是必須Ted'的'一個實例,這可能並不總是成立,你可能只是試圖通過撒謊來使編譯器沉默。只要編譯器能夠看到聲明該方法的頭文件,就可以轉換爲'id'。你已經導入了一個類來聲明一個方法'secretID'就像你的'Ted'類。 – 2012-08-02 15:06:09