根据 Apple 的 Objective C 指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数。
然后有一些关于“静态类型”方法的例外情况。
具有相同名称和返回类型 + 参数的方法是否共享一个选择器,但如果它只是相同的名称但不同的返回类型和/或参数,它将具有不同的选择器 - 如果您发送了这样的消息到它...好吧,我不知道。
根据 Apple 的 Objective C 指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数。
然后有一些关于“静态类型”方法的例外情况。
具有相同名称和返回类型 + 参数的方法是否共享一个选择器,但如果它只是相同的名称但不同的返回类型和/或参数,它将具有不同的选择器 - 如果您发送了这样的消息到它...好吧,我不知道。
选择器表示方法名称,而不是方法签名。在以下示例中:
- (void)someMethod:(int)intParam;
- (id)someMethod:(float)floatParam;
两种方法具有相同的名称 ( someMethod:
),因此具有相同的选择器:@selector(someMethod:)
。
假设您在名为的类中声明了第一个方法,在名为 的类中声明了Foo
第二个方法Bar
。然后:
Foo *foo = …;
Bar *bar = …;
[foo someMethod:42];
[bar someMethod:3.1416f];
是“静态类型”方法调用的示例,因为编译器很清楚应该使用哪种方法,因为foo
和bar
是静态类型的。
现在考虑以下几点:
id foobar = …;
[foobar someMethod:42];
由于foobar
has typeid
是通用的 Objective-C 对象类型,因此编译器没有足够的信息来决定调用哪个方法。它将选择这两种方法中的一种,这可能会很危险,具体取决于返回类型和参数类型之间的差异。这就是为什么 Apple 建议具有相同名称的方法也应该具有相同的签名。Matt Gallagher 写了一篇关于Objective-C 中弱类型的陷阱的博客文章。