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