首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS RunTime之一:简介

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,执行编译的代码,进行消息发送和转发。Objective-CRuntime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。

下面通过分析Apple开源的Runtime代码来深入理解Objective-CRuntime机制。

记得初学Objective-C时,把[object doSomething]当成一个简单的方法调用,而无视了“发送消息”这句话的深刻含义。后来对Runtime的理解慢慢增加了,逐渐明白了[object doSomething]的含义。 当执行[object doSomething]会被编译器转化为:

代码语言:javascript
复制
objc_msgSend(receiver, selector)

如果消息含有参数,则为:

代码语言:javascript
复制
objc_msgSend(receiver, selector, arg1, arg2, ...)

如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。

现在可以看出[receiver message]真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接收者发送message这条消息,而receive将要如何响应这条消息,那就要看运行时发生的情况来决定了。

下一篇
举报
领券