Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 关于动态绑定、目标C和方法的问题_Objective C_Methods_Dynamic Binding - Fatal编程技术网

Objective c 关于动态绑定、目标C和方法的问题

Objective c 关于动态绑定、目标C和方法的问题,objective-c,methods,dynamic-binding,Objective C,Methods,Dynamic Binding,根据苹果公司的Objective C指南,具有相同名称的方法都使用相同的选择器,并且它们需要具有相同的返回类型和参数 “静态类型”方法是例外 因此,具有相同名称和返回类型+参数的方法共享一个选择器,但如果它只是相同名称但不同的返回类型和/或参数,它将具有不同的选择器-如果您向它发送这样的消息。。。好的,我不知道。选择器表示方法名,而不是方法签名。在以下示例中: - (void)someMethod:(int)intParam; - (id)someMethod:(float)floatParam

根据苹果公司的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
具有类型
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
后面的对象,但运行时应该知道这一点,并选择正确的对象作为消息的接收者。但是当运行时不能做到这一点时?