美文网首页
iOS学习之彻底搞清楚Runtime

iOS学习之彻底搞清楚Runtime

作者: 北你妹的风 | 来源:发表于2018-03-02 16:03 被阅读8次

    有人说,学习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用途这块,会专门写一篇文章来介绍。

    相关文章

      网友评论

          本文标题:iOS学习之彻底搞清楚Runtime

          本文链接:https://www.haomeiwen.com/subject/tzaoxftx.html