2012-02-20 64 views
1

如果我的逻辑错误,请纠正我。关于objc运行时的疑问

在java中我们可以这样调用

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

方法在objc我们做

[object doSomething]; 

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

这里我很困惑。

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

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

回答

0

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

+0

Java方法调用实际上并未在编译时绑定。反思和其他事情可以改变方法调用发生的情况,所以这个答案实际上是无效的。 – 2012-08-30 14:37:18

3

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