2010-07-15 36 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问题了解更多详情。