如果我的逻辑错了,请纠正我。
在java中我们可以调用像这样的方法
Object.doSomething(); // here we call method directly
在objc中我们做
[object doSomething];
这里doSomething消息被发送到对象。据我所知,每个对象都有一个指向对象类的指针。 Objc运行时使用该指针来检查对象类是否具有这样的方法如果没有,则检查它的父级等等。如果找到方法,则调用objc_msgSend。
我很困惑。
Java中的方法调用和Objc中的消息之间有什么区别?
他们之间有什么优势/劣势?
答案 0 :(得分:3)
您对objc_msgSend
如何工作感到困惑,objc_msgSend
本身就是发送消息的内容,没有检查该类是否首先包含该方法。这是由发送框架处理的。这允许类在运行时由类重新路由消息,如NSProxy
。
答案 1 :(得分:0)
消息路由在运行时完成(objc) - 编译时的方法绑定(java)。 objc运行时在运行时解析该方法,并且可能在类/超类中找到某些内容,将其转发给其他对象(forwardInvocation)或失败(未找到方法)。这就是为什么objc ppl谈论消息(动态)和java ppl谈论方法(静态)。优点是更具动态性,缺点是可能的运行时错误。