gpt4 book ai didi

objective-c - 仍然对 Objective-C 的动态绑定(bind)感到困惑

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:42 24 4
gpt4 key购买 nike

问题来 self 刚刚添加到 this question 的答案中的评论,但不应重复。

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

最佳答案

简答:C。

扩展:当编译器生成对方法的调用时,它实际上只是生成对 C 函数的调用——对 objc_msgSend() 或其中的变体——动态绑定(bind)和分派(dispatch)该方法。

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

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

现在,从技术上讲,编译器可以为许多情况生成相同的代码,但它选择采取保守的策略并提示。特别是,假设是如果您有 2 个冲突的类型化声明,则可能还有其他声明并提醒您极度不鼓励使用具有不同参数类型的同名方法。

关于objective-c - 仍然对 Objective-C 的动态绑定(bind)感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com