这篇文章是我自己学习runtime时候的笔记,希望能有助于大家了解runtime,水平有限有需要补充或者指正的地方,希望提出来,大家一起学习。
1.Runtime简介
runtime是一个C语言实现的底层库,用于支持OC语言的动态特性。我们知道程序运行的过程分为编译->链接->运行等几个步骤,OC语言尽可能的把一些操作推迟到运行时,动态的处理一些问题。比如在运行时动态的加载一个新类(Dynamic loading),对象之间的消息转发(Dynamic binding),或者在运行时提供线索关于如何查找对象的信息(Dynamic typing)。runtime扮演一个操作系统的角色,使OC语言得以正常运行。
2.Runtime对OC语言的影响
runtime通过三种方式影响着OC程序:1.OC源码,2.定义在NSObject的方法,3.直接使用runtime库提供的相关函数。
1.OC源码:
大多数时候runtime是在后台自发运行工作的,当我们编译OC语言的类或者方法的时候,编译器会生成实现了语言动态特性的数据结构和函数,该数据结构从类,类别,协议里面捕获相关信息,该数据结构包含了类和协议对象,方法选择器,实例变量,和其他一些从源码中提取的信息。
2. NSObject的方法
在IOS里面大部分类都是继承自NSObject,有些NSObject的方法在运行时动态获取一些信息,比如description方法,这是一个重要的调试方法,NSObject并不知道子类里面会有什么,所以在实现这个方法的时候只返回了对象的名字和内存地址。在子类中可以重写这个方法返回更多详细信息,比如打印NSArray,我们可以动态的获取到NSArray对象的相关信息,并且打印出数组包含的对象。有些NSObject的方法运用runtime查询一些信息,这些方法允许对象在运行时自我检查,比如isKindOfClass:和isMemberOfClass:方法可以检查类的继承关系,respondsToSelector:方法检查对象是否可以接收某个消息。
3.直接使用runtime库提供的相关函数
runtime定义了很多接口函数主要功能是消息发送,OC调用相关方法,在底层是通过objc_msgSend函数实现的,runtime提供的API对于混编来说是重要的桥梁,它本身是由纯C语言开发的。相关接口可以查看Objective-C Runtime