Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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文档的这段摘录来解释选择器吗?_Objective C_Selector - Fatal编程技术网

有谁能根据苹果Objective-C文档的这段摘录来解释选择器吗?

有谁能根据苹果Objective-C文档的这段摘录来解释选择器吗?,objective-c,selector,Objective C,Selector,从Apple Objective-C文档中,粗体显示了相关部分: 方法返回和参数类型 消息传递例程只能访问方法实现 通过选择器,因此它使用相同的选择器处理所有方法 同样地它发现方法的返回类型和 它的参数,从选择器因此,发送的消息除外 对于静态类型的接收器,动态绑定需要所有 同名方法的实现具有相同的返回 类型和相同的参数类型。(静态类型的接收器是 此规则的异常,因为编译器可以了解该方法 从类类型执行。) 虽然名称相同的类方法和实例方法是 由同一选择器表示,它们可以有不同的参数 类型和返回类型。 我

从Apple Objective-C文档中,粗体显示了相关部分:

方法返回和参数类型

消息传递例程只能访问方法实现 通过选择器,因此它使用相同的选择器处理所有方法 同样地它发现方法的返回类型和 它的参数,从选择器因此,发送的消息除外 对于静态类型的接收器,动态绑定需要所有 同名方法的实现具有相同的返回 类型和相同的参数类型。(静态类型的接收器是 此规则的异常,因为编译器可以了解该方法 从类类型执行。)

虽然名称相同的类方法和实例方法是 由同一选择器表示,它们可以有不同的参数 类型和返回类型。

我已经一遍又一遍地读了这一段,但我似乎无法克服这一矛盾。首先,由于动态绑定,同名方法的所有实现都需要具有相同的返回类型和参数类型

因为它使用相同的选择器处理所有方法,这是否意味着无论我有多少个不同的对象,如果它们都有EatCake()方法,那么它们都将共享相同的EatCake选择器?如果是,那么为什么它们必须具有相同的参数和返回类型

然后在下一部分中,它说虽然它们由相同的选择器表示,但它们可以有不同的参数类型和返回类型。所以现在我完全糊涂了,我以为它只是说事实并非如此

我并不认为这是一个错误,我只是不理解这两种说法之间的区别


有人能帮我澄清一下吗?

不要求具有相同选择器的所有方法都具有相同的参数和返回类型。选择器只是一个标识方法的名称,没有附加任何信息

问题是,当您调用一个方法时,编译器必须知道参数和返回类型是什么,这样它才能为您执行类型检查。当摘录谈到动态接收器时,它谈到的是具有
id
类型的变量,以及发送到返回
id
的方法结果的消息。因为这只告诉编译器它是一个对象,而不是它是什么类,所以它无法确定应该使用哪个类来确定参数和返回类型。因此,它可以知道的唯一方法是该选择器的所有使用是否都具有相同的参数和返回类型

摘录还解释了静态类型接收器的例外情况,这意味着您为变量类型指定了特定的类,例如
NSString*myString
。因为编译器知道对象必须是
NSString
对象,所以它知道使用该类的参数和返回类型,所以对于不同类的对象,它不需要相同


这一切对运行时绝对没有影响。当您调用一个方法时,运行时将获取该对象的实际类,并使用该类找到要调用的适当实现。它不执行类型检查,因此不关心参数和返回类型是什么。

使用以下引用:

作为实验的补充,我得出了以下令人惊讶的结论(对我来说!),即不可能有两种方法具有完全相同的选择器,但参数/返回类型不同这在全球都适用。

第二种说法令人惊讶。我们发现,在目标C中不可能有方法重载(“给定类的单个选择器只能有一个类型签名”),因此它在本地保持不变。但是,也不能有两个完全相同但不同的、不相关的类:


我暗自怀疑我的结论可能不完全正确,因此如果你知道得更清楚,请告诉我。

是的,OP文档中第二个粗体部分专门讨论了
+classMethods
-instanceMethods
之间的区别。它们的名称空间不同(并且被发送到不同的对象),因此就编译器的检查而言,它们似乎属于不同的类。