根据Apple的Objective C指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数。
然后有一些关于“静态类型”方法的例外。
因此,具有相同名称和返回类型+共享选择器的参数的方法,但如果它只是相同的名称但不同的返回类型和/或参数,它将具有不同的选择器 - 如果您发送这样的消息......好吧,我不知道。
答案 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];
是'静态类型'方法调用的示例,因为编译器清楚应该使用哪种方法,因为foo
和bar
是静态类型的。
现在考虑以下事项:
id foobar = …;
[foobar someMethod:42];
由于foobar
具有类型id
,它是通用的Objective-C对象类型,因此编译器没有足够的信息来决定调用哪个方法。它将选择这两种方法中的一种,这可能很危险,具体取决于返回类型和参数类型之间的差异。这就是为什么Apple建议具有相同名称的方法也应具有相同的签名。 Matt Gallagher撰写了一篇关于the pitfalls of weak typing in Objective-C的博客文章。