定义
Runtime,是一套C++汇编编写的API,将数据类型的确定由编译期推迟到运行时。本质就是消息(方法)发送(objc_msgSend)。
作用
Runtime为OC提供运行时功能。由于OC语言运行时的特性,所以不只依赖编译器,还需要依赖运行时的环境。
机制
当一个对象被调用时,首先在对象所属的类中查找,如果没有则向父类查找,一直找到根类NSObject,如果实在找不到,则进入消息转发。如果转发也没找到,则报crash。
与Runtime 交互
1.通过object-c源代码;2.通过Foundaction框架中的NSObject类定义的方法。3.通过对Runtime函数的直接调用。
runtime运用场景
1.方法调用:objc_msgSend (如:调用类方法)
1.方法的交换(替换):method_exchangeImplementations(具体应用拦截系统自带的方法调用)。
2.实现给分类增加属性。
3.实现字典的模型和自动转换,判断某个类的子类。
4.动态创建方法。
写的不全,都是项目会用到~
Runtime添加实例变量问题
不能向编译之后得到的类中添加实例变量。
因为编译后的类已经注册在Runtime中。类结构体中实例变量的链表和实例变量的内存大小已经确定。
可以向运行时创建的类添加实例变量。
在object_allocateClasspair之后和object_registerClasspair之前,可以在运行时创建的类中添加实例变量。
7.涉及到的概念
类对象,实例,元类,SEL,IMP,类缓存,category。
8.编译时和运行时
编译时:即编译器对语言的编译阶段。编译时只是对语言进行最基本的检查报错,包括词法分析,语法分析等。
编译成功并不意味着程序就可以成功运行。编译是一个静态的阶段。
运行时:即程序编译之后,编译的代码装载到内存跑起来的阶段。这时会对具体类型进行检查。若此时出错程序会崩溃。
运行时是动态阶段