2010-11-25 131 views

回答

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中的动力学性质

一个好处是,你可以在运行时更改类的系统,但是这并不一定相关消息的性质。例如,根据我的理解,mach中的消息传递系统并不这样做。

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

+0

速度怎么样?如果大部分工作都是在C++编译时完成的,那意味着它会更加期待并且因此更快......我是对的吗? (我正在学习视频游戏编程,所以我真的坚持速度) – jokoon 2010-11-25 16:19:18

2

Objective-C的消息没有内置到内核,它是建设成Objective-C的运行时间。

大部分魔术都是在一个名为objc_msgSend()的函数中完成的。如果你写一个Objective-C代码是这样的:

[myObject doStuffWith:something]; 

编译器实际上会产生相同的代码,如果你输入了这一点:

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

objc_msgSend()实现相当快速和智能。通过缓存经常使用的选择器来快速实现,而且它的灵活性在于它允许尽可能晚的实现解决方案。实际上,objc_msgSend()是为查找实际实现的选择器进行哈希查找。

一个优点是,你在这里的是,如果一个方法的实现是没有找到,则该对象可以在运行时可以:

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

带代码的动态类型化语言最明显的优势就是您在代表中看到的优势。正如您可能已经注意到的,例如UITableViewDelegate协议;并非所有的方法都是根据需要声明的

这允许客户端遵从(实现)协议来简单地根本不实现委托方法来推断默认行为。而在例如Java中,除了接口之外,通常还有一个抽象默认实现FooAdapter,其实现了接口中每个方法的默认实现。