Objective C中的消息系统是否依赖于内核消息系统?

时间:2010-11-25 15:27:56

标签: c++ objective-c

我真的不明白ObjC如何有效地依赖消息。这是否意味着像马赫这样的内核必须设计出这个想法?

目标C似乎是一种很好的语言,但我发现它比C ++更容易掌握。

如何使用语言构建的消息系统具有优势?

2 个答案:

答案 0 :(得分:2)

Objective-C中的消息传递与mach内核中的消息传递没有直接关系。它被实现为一个名为objc_msgSend的高度调整的函数。电话

 [obj messageWithX:x andY:y];

被翻译为C调用

 objc_msgSend(obj,@selector(messageWithX:andY:),x,y);

objc_msgSend直接用汇编语言编写,以便进行最大程度的优化。它以非常有效的方式动态解析方法调用。 This blog post是了解如何实施的好地方。

比C ++更容易掌握还是更难掌握取决于你的背景和品味。 C ++和Objective-C支持的面向对象的风格完全不同,因此很难比较。

Objective-C的消息传递系统是高度动态的,大多数决定都可以在运行时完成。 C ++的成员函数调用系统更加静态,并且在编译时尽量做到尽可能多。

Objective-C的动态特性的一个优点是您可以在运行时更改类系统,但这不一定与消息传递性质相关。例如,据我所知,马赫的消息传递系统不会这样做。

与消息传递性质直接相关的一个特性是对象可以捕获它不理解的消息,然后将其转发给其他对象。这可以在马赫中完成:消息的接收者可以在内核空间,用户空间,甚至在另一台机器中,并且消息的发送者不需要关心它。这为设计内核增加了更多灵活性。 (但是OS X中的mach内核中没有使用此功能。)

答案 1 :(得分:2)

Objective-C消息传递没有内置到内核中,它构建在Objective-C运行时。

大多数魔法都是在名为objc_msgSend()的函数中完成的。如果您编写这样的Objective-C代码:

[myObject doStuffWith:something];

编译器实际上会生成相同的代码,就像您键入的一样:

objc_msgSend(myObject, @selector(doStuffWith:), something);

objc_msgSend()的实施非常快速和聪明。通过缓存经常使用的选择器快速,并且智能,因为它允许尽可能晚地实现解决方案。实际上objc_msgSend()的作用是选择器的哈希查找以查找实际的实现。

这里的一个优点是,如果找不到方法的实现,那么该对象可以在运行时:

  • 将调用推迟到另一个对象以充当代理。
  • 动态操作选择器。
  • 将实现动态绑定到以前未知的选择器。

动态类型语言与消息的最显着优势是您在代理中看到的。您可能已经注意到了UITableViewDelegate协议;并非所有方法都被声明为必需。

这允许符合(实现)协议的客户端仅通过不实现委托方法来推断默认行为。而在例如Java中,除了接口Foo之外,还有一个抽象的默认实现FooAdapter,它实现了接口中每个方法的默认实现。