有人说,学习Objective-C的Runtime是为了装逼。对此言论,不敢苟同。
Objective-C是面向对象的编程语言,具有动态语言的特性。这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象、进行消息传递和转发。
深入了解Runtime,就会发现Runtime其实是整个Objective-C语言运行的基础,且有助于我们更深层次的了解Objective-C这门语言,有助于我们写出质量更高的代码,适当的时候还能对语言进行扩展,从系统层面解决项目中的一些设计或技术问题,可绝不是为了装逼。
要深入了解 Runtime ,要先了解它的核心 - 消息传递 (Messaging)。
在Objective-C中,函数的调用是不同于其他语言,语法类似这样:
[obj methodA:param],当初从java转入学习Objective-C时,真的是别扭了好久才慢慢的接受。
这种语法实际是借鉴smalltalk语言的消息传递机制。Runtime会根据消息接收者能否相应该消息做出不同的反映,并且这些都是在运行期决定的。在Runtime中,有这样一个函数:objc_msgSend。Objective-C的消息传递,最终转化为objc_msgSend函数的调用。看下objc_msgSend函数的定义:
objc_msgSend(receiver, selector, arg1, arg2,...)
receiver是指消息接受对象,也就是函数调用者,selector是指消息名,arg是参数。
函数调用过程中,会遍历对象所属的类以及父类中,去寻找名字为selector的方法,找到了就调用,没找到就做消息转发处理。
这个过程中涉及到几个概念:类,对象,方法,具体参看之前写过的一篇文章。
搞清楚了这些概念,搞清楚了消息传递机制,Objective-C代码运行机制基本上也就了解了。
实际上,Objective-C的好多语法都是依赖于Runtime.随便举2个例子:
KVC/KVO 实现过程中使用Runtime动态创建类
Categary 获取主类的方法列表并动态添加方法
这两个都是很基础的东西,搞清楚这两个,不算是装逼吧?
其他的用途还有:方法互换(method swizzling),对象关联(tAssociated Object),字典转模型等。
关于Runtime用途这块,会专门写一篇文章来介绍。
网友评论