4

我知道 Objective-C 对所有方法调用都使用动态绑定。这是如何实施的?Objective-c 是否在编译之前“变成 C 代码”并且只对所有内容使用 (void*) 指针?

4

2 回答 2

11

从概念上讲,发生的事情是有一个调度程序库(通常称为 Objective C 运行时),编译器会转换如下内容:

[myObject myMethodWithArg:a andArg:b ];

进入

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

然后运行时处理所有绑定和分派,找到合适的函数,并使用这些参数调用它。简单地说,您可以将其视为哈希查找。当然,实际情况要复杂得多。

还有更多与方法签名等相关的问题(C 不对类型进行编码,因此运行时需要处理它)。

于 2009-11-08T17:04:49.797 回答
4

每个Objective C 方法都“在后台”作为(实际上)一个C 函数来实现。该方法具有与之关联的消息(文本字符串),并且该类具有将消息字符串与 C 函数匹配的查找表。所以当你调用一个Objective C方法时,真正发生的事情是你向对象发送一个消息字符串,对象在其类的方法查找表中查找相关的C函数并运行它。

Objective C 中还有更多内容,比如对象如何通过转发它们来处理它们不理解的消息,它们如何缓存消息到方法的查找,等等,但这是基础。

C++ 是类似的,除了这个类没有消息表,它有一个叫做“vtable”的东西,你调用一个方法不是通过文本字符串,而是通过它在 vtable 中的偏移量。这是静态绑定的一种形式,在一定程度上加快了执行速度,但不如动态绑定灵活。

于 2009-11-08T17:10:03.207 回答