【问题标题】:Thoughts about objc runtime关于 objc 运行时的思考
【发布时间】:2012-02-20 15:57:46
【问题描述】:

如果我的逻辑有误,请纠正我。

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

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

在 objc 中我们这样做

[object doSomething]; 

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

在这里我很困惑。

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Java 方法调用实际上并没有在编译时绑定。反射和其他东西可以改变方法调用上发生的事情,所以这个答案实际上是无效的。
      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 2010-10-19
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2013-12-10
      • 1970-01-01
      相关资源
      最近更新 更多