runtime
2020-04-22 本文已影响0人
不如养花
Runtime
什么是Runtime
- OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行
- OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数
- 平时编写的OC代码,底层都是转换成了Runtime API进行调用
具体应用
- 利用关联对象给分类添加属性
- 遍历类的所有成员变量(字典转模型,自动归档解档)
- 交换方法实现(交换系统方法)
- 利用消息转发机制解决方法找不到的异常问题
weak实现原理
super的本质
-
self还是super真正调用的对象都是一样的,只是查找方法的位置不一样,self是从当前类结构中开始查找,super是从父类中查找,但方法真正的接受者都是当前类或者当前类的对象
-
[self message]:会转化为objc_msgSend(id self,SEL _cmd)这个函数,在当前类结构中找到方法并且调用
-
[super message]:
super调用,底层会转换为objc_msgSendSuper2函数的调用,接收2个参数:struct objc_super2,SEL
image.png
receiver是消息接收者
current_class是receiver的Class对象
Runtime如何实现weak属性
- weak 关键字的作用弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为 nil。
- runtime对注册的类,会进行布局,会将weak对象放入一个hash表中,用weak指向的对象的内存地址作为key,当此对象的引用计数为0的时候会调用对象的dealloc方法,假设指向的对象的内存地址是a,那么会以a为key,在这个weak hash表中搜索,找到所有以a为key的weak对象,从而设置为nil。
- weak表其实是一个哈希表,key是所指对象的指针,value是weak指针的地址数组。(value是数组的原因是:因为一个对象可能被多个弱引用指针指向)
- Runtime维护了一张weak表,用来存储某个对象的所有的weak指针。
isa指针
arm64之前,普通指针
arm64之后,共用体(union)结构,使用位域存储更多的信息