objective-c之runtime简介

参考博文:http://tech.glowing.com/cn/objective-c-runtime/

      objective-c扩展了C语言,并加入了面向对象的特性和Smalltalk的消息传递机制。而这个扩展的核心是用一个C和汇编语言写的runtime库。它是objective-c面向对象和动态机制的基石。

      objective-c是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态创建类和对象,进行消息传递和转发。理解runtime可以帮我们更好的了解这个语言,适当的时候还能够对这个语言进行扩展,从系统层面解决设计和技术问题。可见:runtime的功能有如下几个:

1.runtime来动态创建类和对象;

2.进行消息传递和转发。


消息机制(Messaging)

I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea.The big idea is “messaging” – that is what the kernal[sic] of Smalltalk is all about... The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be.

Alan强调太多的人把主要关注度放到了对象上,然而那仅仅是lesser ideabig idea才是“Messaging”,最重要的是模块间的沟通,而不是内部的行为和属性应该是怎样的。

在很多语言,例如C语言,调用一个方法其实就是跳到内存中的某一点并开始执行一段代码。没有任何动态的特性,因为这在编译时就做好了。而在objective-c中,【object foo】语法并不会立即执行foo这个方法的代码。它是在运行时给object发送一条叫做foo的消息。这个消息,也许会由object来处理,也许会被转发给另一个对象,或者不予理睬假装没收到这个消息。多条不同的消息也许会对应同一个方法实现。这些都是在程序运行时候决定的。

事实上,在我们编写oc代码的后,编译时会被编译成一个c的函数调用-objc_msgSend()。比如:下边两行代码是等效的:

[array insertObject:foo atIndex:5];

objc_msgSend(array,@selector(insertObject:atIndex:),foo,5);

消息传递的的关键藏于objc_object中的isa指针和objc_class中的class dispatch table。

你可能感兴趣的:(objective-c之runtime简介)