概述
runtime:Objective-C是动态语言,它将很多静态语言在编译和链接时做的事放到了运行时,这个运行时系统就是runtime。
runtime其实就是一个库,它基本上是用C和汇编写的一套API,这个库使C语言有了面向对象的能力。
静态语言:在编译的时候会决定调用哪个函数。
动态语言(OC):在运行的时候根据函数的名称找到对应的函数来调用。
isa:OC中,类和类的实例在本质上没有区别,都是对象,任何对象都有isa指针,它指向类或元类(元类后面会讲解)。
SEL:SEL(选择器)是方法的selector的指针。方法的selector表示运行时方法的名字。OC在编译时,会依据每一个方法的名字、参数,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。
IMP:IMP是一个函数指针,指向方法最终实现的首地址。SEL就是为了查找方法的最终实现IMP。
Method:用于表示类定义中的方法,它的结构体中包含一个SEL和IMP,相当于在SEL和IMP之间作了一个映射。
消息机制:任何方法的调用本质就是发送一个消息。编译器会将消息表达式[receiver message]转化为一个消息函数objc_msgSend(receiver, selector)。
Runtime的使用:获取属性列表,获取成员变量列表,获得方法列表,获取协议列表,方法交换(黑魔法),动态的添加方法,调用私有方法,为分类添加属性。
什么是runtime运行时
概述中已经说了,runtime其实就是一个库,这个库主要做了两件事情:
1. 封装:runtime把对象用C语言的结构体来表示,方法用C语言的函数来表示。这些结构体和函数被runtime封装后,我们就可以在程序运行的时候,对类/对象/方法进行操作。
2. 寻找方法的最终执行:当执行[receiver message]的时候,相当于向receiver发送一条消息message。runtime会根据reveiver能否处理这条message,从而做出不同的反应。
在OC中,类是用Class来表示的,而Class实际上是一个指向objc_class结构体的指针。
主要依据:
##runtime的一些使用
-获取类的属性列表
-获取类的方法列表
-获取类的协议列表
-获取类的成员变量列表
-改变私有变量的值
-为一个类增加新方法
-为类的category 增加新的属性
-交换方法
-自动归档/解档