0

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

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

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

4

1 回答 1

5

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

- (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];

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

于 2011-07-07T09:43:43.520 回答