runtime运行时机制

1,说一下运行时机制
运行时机制:
1> runtime,运行时机制,它是一套C语言库
2> 实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)
3> 因此,可以说runtime是OC的底层实现,是OC的幕后执行者
4> 有了runtime库,能做什么事情呢?runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等
 
运行时机制是c语言的一套框架,包含了很多c语言的api,我们写的oc代码,在程序运行时都会转换成runtime C语言的代码,所以说runtime算是oc的幕后工作者,举个例子,比如 [[person alloc] init],运行时会变成 objc_msgSend(objc_msgSend(“person ” “alloc”)”init”);
由于runtime是oc底层的,所以可以来实现oc不能实现的,或者很难实现的底层操作,
比如在程序运行中,动态的创建一个类,kvo就是基于运行时机制来实现的,kvo的目的就是一个对象监听另一个对象值得改变,kvo的内部实现是,当一个类的某个对象第一次被观察时,系统会在运行期动态的创建一个派生类,重写基类中任何被观察属性的setter方法,在派生类中重写setter方法实现真正的通知机制
还可以动态的获取一个类的属性,成员变量,方法,,协议信息。 用于字典转模型框架
还可以修改类的方法,属性,比如交换方法,也就是常说的黑魔法。就是运行时动态的改变一个对象的一个方法。
 
还可以遍历一个类的成员变量和方法。比如归档,解档
 
还可以封装第三方框架,比如SDweiImage ,主要是给分类添加动态属性,这样可是使第三方框架更完善。
 
运行时的相关函数有
Objc_msgSend  给对象发消息

class_copyMethodList :遍历某个类所以的方法
Class_copyIvarList: 遍历某个类所以的成员变量
runtime怎么添加属性方法
* class_addProperty
* class_addMethod

runtime的应用:
1.动态创建一个类(比如KVO的底层实现)
 2.动态地为某个类添加属性\方法, 修改属性值\方法
3.遍历一个类的所有成员变量(属性)\所有方法
实质上,以上的是通过相关方法来获取对象或者类的isa指针来实现的。
相关函数

1.  增加
增加函数:class_addMethod

增加实例变量:class_addIvar
增加属性:@dynamic标签,或者class_addMethod,因为属性其实就是由getter和setter函数组成
增加Protocol:class_addProtocol (说实话我真不知道动态增加一个protocol有什么用,-_-!!)
2.  获取
获取函数列表及每个函数的信息(函数指针、函数名等等):class_getClassMethod method_getName ...
获取属性列表及每个属性的信息:class_copyPropertyList property_getName
获取类本身的信息,如类名等:class_getName class_getInstanceSize
获取变量列表及变量信息:class_copyIvarList
获取变量的值
3.    替换
将实例替换成另一个类:object_setClass
替换类方法的定义:class_replaceMethod
4.其他常用方法:
交换两个方法的实现:method_exchangeImplementations.
设置一个方法的实现:method_setImplementation.
必备常识
 1> Ivar : 成员变量
  2> Method : 成员方法
运行时特性:
OC中是发送消息(消息结构):运行时所执行的代码是由运行环境决定,函数调用的语言运行时执行的代码,是由编译器决定。OC重要的工作都由runtime component完成,runtime component本质是一种与开发者编写的代码相关连的dynamic library,这样以来,只要更新runtime component即能提升程序性能。

你可能感兴趣的:(runtime运行时机制)