运行时简单介绍

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

你可能感兴趣的:(运行时简单介绍)