Objective-C
语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。Objective-C
是基于C
语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime
系统来动态创建类和对象,执行编译的代码,进行消息发送和转发。Objective-C
的Runtime
其实是一个Runtime
库,它基本上是用C
和汇编写的,这个库使得C
语言有了面向对象的能力。
下面通过分析Apple开源的Runtime代码来深入理解Objective-C
的Runtime
机制。
记得初学Objective-C
时,把[object doSomething]
当成一个简单的方法调用,而无视了“发送消息”这句话的深刻含义。后来对Runtime
的理解慢慢增加了,逐渐明白了[object doSomething]
的含义。 当执行[object doSomething]
会被编译器转化为:
objc_msgSend(receiver, selector)
复制代码
如果消息含有参数,则为:
objc_msgSend(receiver, selector, arg1, arg2, ...)
复制代码
如果消息的接收者能够找到对应的selector
,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector
对应的实现内容,要么就干脆玩完崩溃掉。
现在可以看出[receiver message]
真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接收者发送message
这条消息,而receive
将要如何响应这条消息,那就要看运行时发生的情况来决定了。