仍然对Objective-C的动态绑定感到困惑

时间:2012-02-27 05:31:10

标签: objective-c dynamic-binding

问题来自我刚刚添加到this question答案的评论,但它不应该是重复的。

@Bavarious对这个问题的回答对我来说很有意义,但我仍然感到困惑,为什么运行时无法将方法绑定到正确的对象,即使对象是id?根据我的理解,dynamic bindingdynamic typing是编译器无法知道id后面的对象,但运行时应该知道并选择正确的对象作为消息的接收者。但为什么运行时不能这样做?

1 个答案:

答案 0 :(得分:4)

简答:C。

扩展:当编译器生成对方法的调用时,它实际上只是生成对C函数的调用 - 对objc_msgSend()或其中的变量 - 动态绑定和调度方法。

因为C ABI在“金属”上运行(非常接近),所以传递参数和返回值的方式可能会根据类型发生显着变化。例如,编译器可以在寄存器中传递最大32位大小的任何东西(或某些架构中的64位),但任何更大的东西都会在堆栈本身上传递。

因此,编译器不一定会发出一个通用的程序集来调用objc_msgSend() - 调用方法调用 - 通过(id)作为不同的签名 - 方法的不同参数类型 - 可能需要不同的代码生成。

现在,从技术上讲,编译器可以为许多情况生成相同的代码,但它选择采取保守的策略并抱怨。特别是,假设你有2个冲突的类型声明,可能还有其他声明,并提醒你强烈建议不要使用不同参数类型的同名方法。