关于动态绑定,目标C和方法的问题

时间:2011-07-07 09:37:02

标签: objective-c methods dynamic-binding

根据Apple的Objective C指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数。

然后有一些关于“静态类型”方法的例外。

因此,具有相同名称和返回类型+共享选择器的参数的方法,但如果它只是相同的名称但不同的返回类型和/或参数,它将具有不同的选择器 - 如果您发送这样的消息......好吧,我不知道。

1 个答案:

答案 0 :(得分:6)

选择器表示方法名称,而不是方法签名。在以下示例中:

- (void)someMethod:(int)intParam;
- (id)someMethod:(float)floatParam;

这两种方法都具有相同的名称(someMethod:),因此选择了相同的选择器:@selector(someMethod:)

假设您已在名为Foo的类中声明了第一个方法,并在名为Bar的类中声明了第二个方法。然后:

Foo *foo = …;
Bar *bar = …;

[foo someMethod:42];
[bar someMethod:3.1416f];

是'静态类型'方法调用的示例,因为编译器清楚应该使用哪种方法,因为foobar是静态类型的。

现在考虑以下事项:

id foobar = …;

[foobar someMethod:42];

由于foobar具有类型id,它是通用的Objective-C对象类型,因此编译器没有足够的信息来决定调用哪个方法。它将选择这两种方法中的一种,这可能很危险,具体取决于返回类型和参数类型之间的差异。这就是为什么Apple建议具有相同名称的方法也应具有相同的签名。 Matt Gallagher撰写了一篇关于the pitfalls of weak typing in Objective-C的博客文章。