1.runtime使用的是运行时机制,它是一套C语言的框架
2.runtime库里面包含了跟类、成员变量、方法相关的 API
3.runtime能获取类里面的所有成员变量,为类动态添 加成员变 量,动态改变类的方法实现,为类动态添加新的方法等
4.使用runtime需要导入<objc/message.h><objc/runtime.h>
5.我们编写的OC代码,最终都转化成runtime库里的东西,例如类转化成路里的结构体等数据类型,而方法转成了 runtime库里面的C语言函数 ,平时调方法都是转成了objc_msgSend 函数 ,即每个方法在运行时会被动态转为消息发送
6.使用objc_msgSend 函数个过程:
6.1.objc 在向一个对象发送消息时,runtime 库会根据对象的 isa 指针找到该对象实际所 属的类
6.2.然后在该类中的方法列表以及其父类方法列表中寻找方法运行
6.3.如果,在最顶层的父类(一般也就 NSObject)中依然找不到相应的方法时,程序在 运行时会挂掉并抛出异常 unrecognized selector sent to XXX
6.4.但是在这之前,objc 的运行时会给出三次拯救程序崩溃的机会,这三次拯救方法没有实现,程序就会崩溃
6.5.三次拯救的第一次拯救方法: resolveInstanceMethod
6.6.三次拯救的第二次拯救方法: -forwardingTargetForSelector:
6.7.三次拯救的第二次拯救方法: -methodSignatureForSelector:如果这个方法返回nil,就实现-methodSignatureForSelector: