objc:避免协议方法名称冲突?

时间:2010-07-15 03:39:02

标签: iphone objective-c

我用方法名定义协议是:

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

在我的项目中,还有第三方协议(在不同的类中):

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

在另一个导入两个协议的类中,我只使用第二种方法:

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

但是XCode显示错误:self不符合<Foo>协议,而self不需要符合该协议。

如何避免这种命名冲突?

2 个答案:

答案 0 :(得分:5)

更改方法的名称。

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

答案 1 :(得分:4)

我不是百分之百确定我是否理解你在做什么,但我认为问题在于你试图在目标C中使用协变方法(具有相同选择器名称的方法,但是不同类型的参数)。 / p>

从技术上讲,你编写的代码在运行时可以正常工作,但由于编译器没有足够的类型信息来知道它调度消息的目的是什么类,所以它无法知道两者中的哪一个不同initWithDelegate:是对象的正确对象,所以它猜测(好吧,我认为它实际上总是使用第一个声明的那个,但重点是它做出了一个随意的决定)。这意味着对一个或另一个的呼叫将始终发出警告。 Apple建议的解决方案是不要使用具有不同类型的同名方法。

您可以查看this问题了解更多详情。