2010-07-15 67 views
3

我定義協議與方法名是:objc:避免協議方法名稱衝突?

- (id)initWithDelegate:(id <Foo>)delegate; 

雖然在我的項目,也有一個第三方協議(在不同的類):

- (id)initWithDelegate:(NSObject *)delegate; 

在另一大類,其中進口兩協議,我只用第二種方法:

id thirdPartyObject = [[ThirdPartyClass alloc] initWithDelegate:self]; 

但XCode中顯示一個錯誤:自不符合<Foo>協議,而自不必以符合該協議。

如何避免這種命名衝突?

回答

5

更改方法的名稱。

- (id)initWithFooDelegate(id<Foo>)delegate; 
+0

其實,我確實嘗試過這個解決方案,但我仍然問是否有其他解決方案來解決這個煩人的問題 – KONG 2010-07-15 04:54:56

4

我不是100%肯定,如果我理解你在做什麼,但我認爲問題是,你要使用的目標C協方法(使用相同的選擇名字的方法,但不同類型的參數)。

從技術上講,你編寫的代碼在運行時可以正常工作,但是由於編譯器沒有足夠的類型信息來知道它調度消息的目標類是什麼,它無法知道哪兩個不同的initWithDelegate:對對象來說是正確的,所以它猜測(嗯,我認爲它實際上總是使用第一個聲明的,但重點是它做出了任意的決定)。這意味着對其中一方的電話總是會發出警告。 Apple建議的解決方案是不使用具有不同類型的相同名稱的方法。

您可以結帳this問題了解更多詳情。