您的位置:首页 > 其它

runtime运行时机制

2016-03-25 10:58 211 查看
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即能提升程序性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: