runtime :
runtime:运行时,操作类的函数是以class_开头,操作成员变量的函数以ivar_开头。
在OC中,用类创建的对象被称为类的实例,任何一个类都是一个对象,类和类的实例并没有什么区别,任何对象都有一个isa指针。
isa:是一个class类型的指针,每个实例对象都有个isa指针,这个指针指向对象的类,而他指向的这个类也有一个isa指针,这个指针指向元类,在指向的这个元类里保存了类方法的列表,当类方法被调用时,先从类的本身查找方法的实现,如果没有,元类就会向该类的父类寻找被调用的这个方法。
元类也是一个类,也是一个对象,所以元类也有一个isa指针,这里的isa指针最终指向一个根元类,这个根元类也会有自己的isa指针,这个根元类的isa指针指向自己,形成了一个封闭的内循环。
runtime:见名之意,值得是一个程序在运行着的状态,也就是说一个程序正在运行或者被执行着的状态,就叫做runtime运行时。在一些编程语言中,把某些可以重用的程序或者实例打包或者重建成运行库,这些实例可以在他们运行的时候被连接或者被任何程序调用。
OC中的runtime,是一套比较纯底层的C语言API,属于一个C语言库包含了很多底层的C语言API。在我们平时编写的OC代码中,程序运行的时候,其实最终都是转成了runtime的C语言代码。
runtime的应用:1,利用运行时可以动态的创建一个类(比如KVO的底层实现,KVO中的派生类就是利用了运行时进行动态创建出来的)。
2,利用运行时可以动态的为某个类添加属性和方法,修改方法和属性的值。
3,利用运行时可以遍历一个类的所有成员变量和所有的方法,可以对类进行增、改、查的操作。
其实就是通过相关的方法来获取对象或者类的isa指针来实现的。
OC中运行时定义了集中重要的类型:
Class:定义OC的类。
Ivar:定义对象的实例变量,包括类型和名字。
Protocol:定义正式协议。
objc_property_t:定义属性。
Method :定义对象方法或类方法。
SEL:定义选择器。选择器是方法名的唯一标识符。
IMP:定义方法实现。
*相关的函数:
1,增加
-增加函数:class_addMethod
-增加实例变量:class_addIvar
-增加属性:可以增加属性,为属性增加setter和个getter方法或者@dynamic(@dynamic是相对于@synthesize的,它们用样用于修饰@property,用于生成对应的的getter和setter方法。但是@ dynamic表示这个成员变量的getter和setter方法并不是直接由编译器生成,而是手工生成或者运行时生成)
-增加协议protocol:class_addProtocol
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
网友评论