Objective c 关于动态绑定、目标C和方法的问题
根据苹果公司的Objective C指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数 “静态类型”方法是例外Objective c 关于动态绑定、目标C和方法的问题,objective-c,methods,dynamic-binding,Objective C,Methods,Dynamic Binding,根据苹果公司的Objective C指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数 “静态类型”方法是例外 因此,具有相同名称和返回类型+参数的方法共享一个选择器,但如果它只是相同名称但不同的返回类型和/或参数,它将具有不同的选择器-如果您向它发送这样的消息。。。好的,我不知道。选择器表示方法名,而不是方法签名。在以下示例中: - (void)someMethod:(int)intParam; - (id)someMethod:(float)floatParam
因此,具有相同名称和返回类型+参数的方法共享一个选择器,但如果它只是相同名称但不同的返回类型和/或参数,它将具有不同的选择器-如果您向它发送这样的消息。。。好的,我不知道。选择器表示方法名,而不是方法签名。在以下示例中:
- (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对象类型,因此编译器没有足够的信息来决定调用哪个方法。它将选择这两种方法中的一种,根据返回类型和参数类型之间的差异,这可能是危险的。这就是为什么苹果建议具有相同名称的方法也应该具有相同的签名。Matt Gallagher写了一篇关于的博客文章。选择器代表方法名,而不是方法签名。在以下示例中:
- (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对象类型,因此编译器没有足够的信息来决定调用哪个方法。它将选择这两种方法中的一种,根据返回类型和参数类型之间的差异,这可能是危险的。这就是为什么苹果建议具有相同名称的方法也应该具有相同的签名。马特·加拉赫(Matt Gallagher)写了一篇关于……的博客文章。啊。。。非常感谢。非常感谢。只需小心处理'id'类型的变量,如果两个方法不“相关”且具有相同的签名,那么请避免使用相同的名称命名它们。附言:我真的应该注册,这样我就可以投票了。@如果这些方法有相同的签名,这也不是问题。如果方法具有相同的名称但签名不同,则可能会出现问题。即使您没有将变量声明为id
,也有几种返回类型为id
的框架方法,因此您可能会在没有注意到的情况下遇到麻烦。谢谢您的警告。来自Java,在Java中,编译器尽其所能防止您自食其果。这里的松散打字有点文化冲击。LOLHi,@bavariable,还有一件事让我困惑,为什么运行时不能将方法绑定到正确的对象,即使对象是id
?据我所知,动态绑定
或动态类型
是指编译器无法知道id
后面的对象,但运行时应该知道这一点,并选择正确的对象作为消息的接收者。但是当运行时不能这样做的时候?啊。。。非常感谢。非常感谢。只需小心处理'id'类型的变量,如果两个方法不“相关”且具有相同的签名,那么请避免使用相同的名称命名它们。附言:我真的应该注册,这样我就可以投票了。@如果这些方法有相同的签名,这也不是问题。如果方法具有相同的名称但签名不同,则可能会出现问题。即使您没有将变量声明为id
,也有几种返回类型为id
的框架方法,因此您可能会在没有注意到的情况下遇到麻烦。谢谢您的警告。来自Java,在Java中,编译器尽其所能防止您自食其果。这里的松散打字有点文化冲击。LOLHi,@bavariable,还有一件事让我困惑,为什么运行时不能将方法绑定到正确的对象,即使对象是id
?据我所知,动态绑定
或动态类型
是指编译器无法知道id
后面的对象,但运行时应该知道这一点,并选择正确的对象作为消息的接收者。但是当运行时不能做到这一点时?