2012-09-26 57 views
1

我只是試圖更深入地理解Objective C.在conformsToProtocol檢查後拋出

爲什麼我必須在調用之前施放以避免警告?這不是編譯器的小菜一碟嗎?有什麼動態的方面,我錯過了?

if ([a.class conformsToProtocol:@protocol(P1)]) 
{ 
    [(id<P1>)a p1Message]; 
} 

我的意思是,我的理解是在視C/C++點,但我使用的目標C編譯器畢竟,我不喜歡的類型轉換。 :)

+4

'[[a class] conformsToProtocol:...]'可以寫成'[a conformsToProtocol:...]' – user102008

回答

1

如果a是一個特定的類型,在編譯時聲明自己實施P1那麼你不應該投。

如果aid類型,那麼只有當返回類型不明確且實際使用它時,或者它有參數時,才需要進行強制轉換。這通常意味着方法名稱p1Message有多個方法簽名,因此編譯器不知道該期待什麼。

如果a是某種類型的作爲實施P1然後將未聲明本身 - 除非它分開(與repetitiously)宣佈p1Message - 你會得到一個警告,因爲你調用該對象可能無法實現方法。

如果我猜,大概a被宣佈爲id類型,而不是id <P1>(這是比較正常的,也就是說,代表),並有多個p1Message飛行已經左右。您也可以主動進行演員陣容,因爲有一天,您可能會擁有多個不同的同名消息,而其他人可能會實施p1Message不應該知道項目中有人使用該方法名稱的其他任何地方。

編譯器無法從conformsToProtocol:檢查中發現,由於它是動態運行時,因此可以安全地調用p1Message。您可能在編譯時或運行時取代了conformsToProtocol:的不同實現,這意味着假定編譯器知道它的作用並不安全。該調用將像其他任何動態一樣動態調度。