美文网首页
runtime学习笔记

runtime学习笔记

作者: 灬小0哥 | 来源:发表于2019-04-15 17:58 被阅读0次

runtime 运行时机制

是由c开发的一套api,是个c语言库。
oc语言写的代码最终都会转成c语言代码,所以runtime是oc的幕后工作者,
object-c需要使用runtime来实现创建类跟对象,实现消息的发送和转发。
简单的说runtime 就是一个库,这个库使得我们能够在程序运行时进行对象,类的创建,对类对象方法的修改

runtime到底干啥了

1 动态的添加类 动态的进行属性的添加 删除 修改
2 遍历所有的类的成员变量 属性 方法 协议 所有的方法列表
3 消息的传递和转发

runtime 是怎么工作的

objc_object

创建实例 我们常用的id类型其实就是一个objc_object,objc_object是个结构体,他内部有一个isa_t属性,是一个isa指针类型的属性,Isa指针有两种指针类型 指针类型isa isa值代表class对象地址,非指针性isa的部分值是calss对象,每一个对象都是一个由一个类创建的,所以这个isa指针指向的是对象所对应的类。

objc_class

Class=》每一个类对象都是一个objc_Class结构体,这个对象继承自元类,这个结构题内部有 class superClass 父类对象,cache_t() class_data-bits_t () method name ivar
cache 缓存池 runtime会把isa指向的类中调用的方法 就是系统调用的方法 存放到chche中 这样系统查找方法就是从缓存中先查找,这样优化调用效率,cache中有bucket_t【】 这个数组中存放key:imp。key是selector方法对象 imp是指针指向方法所对应的实现体
class_data_bits_t
class_data_bits_t是对class-rw-t的封装
class-rw-t(分类中)是对代表了相关类的读写信息,也是对class-ro-t的封装
还包含分类中的protocol协议,properties属性,方法method的封装(方法methids二维数组:每个元素的都是一个数组,每个元素都是一个method-t key:imp)
class_ro_t (原始类中的) 是代表类相关的只读信息 name 类名称,NSclassfromstring方法传入类名称获取类,ivars 成员变量 properties 属性 protocols 协议 methods一位数组 方法

mehod_t

Sel name types 返回值类型

消息传递过程

调用实例方法a 根据实例的isa指针找到类对象 查找方法列表 如果没有就会根据superclass的指向查找类的类方法查找,如果找到根数据类型
依然没有找到就会消息转发
调用类方法b 根据类的isa指针找到对应的元类对象 查找方法类表,如果没有找到根据superclass指向的元类对象 在方法列表查抄 如果找到根元类对象依然没有找到 就会去跟类对象查找 如果没有找到 消息转发

消息传递机制

【self class】 实例方法
1 缓存是否命中 哈希查找
2 当前类查找 有序 二分查找 无序 一般遍历
3 根据superclass去父类中查找 继续走 1 ,2 步骤 最后没有命中退出

缓存查找

在objc_Class结构体中有cache_t 这个结构体内有个[bucket_t]数组存放runtime被调用的方法 每个元素都是@selector的key 对应 imp方法指针 ,根据给定的方法去哈希查找是否命中,

当前类查找

根据实例对象所对应的isa指针找到类对象,在类所包含的方法列表中查找,对于有序的进行二分查找,无序的进行普通查找,

父类中方法列表逐级查找

如果当前类方法查找未命中,objc_class结构体中superclass的父类对象,在父类对象对象的方法列表中查找,直到最后的根对象中寻找未命中,执行消息转发机制。
(如果是类方法查找,在元类中通过superclass逐级查找,到根元类方法中没有命中,再去根实例类方法中查找是否有同名的方法体,如果有执行,没有进行消息转发)

消息转发机制

Method_Swizzling 黑魔法 方法交换

在+load方法中
Method test = class_getInstanceMethod(self,@selector(test));获取交换方法1
Method otherTest = class_getInstanceMethod(self,@selector(otherTest));获取方法
//执行交换
method_exchangeImplementions(test,otherTest)

动态添加方法

相关文章

网友评论

      本文标题:runtime学习笔记

      本文链接:https://www.haomeiwen.com/subject/pptuwqtx.html