关于objc运行时的想法

时间:2012-02-20 15:57:47

标签: objective-c

如果我的逻辑错了,请纠正我。

在java中我们可以调用像这样的方法

Object.doSomething(); // here we call method directly

在objc中我们做

[object doSomething]; 

这里doSomething消息被发送到对象。据我所知,每个对象都有一个指向对象类的指针。 Objc运行时使用该指针来检查对象类是否具有这样的方法如果没有,则检查它的父级等等。如果找到方法,则调用objc_msgSend。

我很困惑。

Java中的方法调用和Objc中的消息之间有什么区别?

他们之间有什么优势/劣势?

2 个答案:

答案 0 :(得分:3)

您对objc_msgSend如何工作感到困惑,objc_msgSend本身就是发送消息的内容,没有检查该类是否首先包含该方法。这是由发送框架处理的。这允许类在运行时由类重新路由消息,如NSProxy

答案 1 :(得分:0)

消息路由在运行时完成(objc) - 编译时的方法绑定(java)。 objc运行时在运行时解析该方法,并且可能在类/超类中找到某些内容,将其转发给其他对象(forwardInvocation)或失败(未找到方法)。这就是为什么objc ppl谈论消息(动态)和java ppl谈论方法(静态)。优点是更具动态性,缺点是可能的运行时错误。