任何人都可以根据Apple Objective-C文档的摘录解释选择器吗?

Met*_*uru 7 objective-c selector

从Apple Objective-C文档中,加粗相关部分:

方法返回和参数类型

消息传递例程只能通过选择器访问方法实现,因此它使用相同的选择器来处理所有方法.它从选择器中发现方法的返回类型及其参数的数据类型.因此,除了发送到静态类型接收器的消息之外,动态绑定要求具有相同名称的方法的所有实现具有相同的返回类型和相同的参数类型.(静态类型的接收器是此规则的一个例外,因为编译器可以从类类型中了解方法实现.)

虽然同名的类方法和实例方法由同一个选择器表示,但它们可以具有不同的参数类型和返回类型.

我一遍又一遍地阅读这个街区,但我似乎无法超越似乎是矛盾的东西.首先,它说由于动态绑定,所有具有相同名称的方法的实现都需要具有相同的返回类型和参数类型.

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

然后在下一部分中它表示尽管它们由相同的选择器表示,但它们可以具有不同的参数类型和返回类型.所以现在我完全糊涂了,我以为它只是说不是这样的.

我不认为这是一个错误,我希望我根本不理解这两个陈述之间的区别.

任何人都可以为我清除这个吗?

ugh*_*fhw 4

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

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

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

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

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