美文网首页
iOS学习- Runtime -1

iOS学习- Runtime -1

作者: 快乐的tomato | 来源:发表于2021-09-25 15:58 被阅读0次

一、是什么

OC是一门动态性比较强的语言,跟C、C++有很大的不同
OC的动态性是由Runtime API来支撑的,Runtime API提供的接口都是C语言的,源码由C/C++/汇编编写。
Runtime 运行时,将尽可能多的决策从编译时和链接时推迟到运行时。

二、isa指针

1、是什么?

arm64之前,isa就是一个普通的指针,存储着class/meta-class对象的内存地址



arm64之后,对isa进行了优化,变成了一个共用体结构,还是用位域技术来存储更多的信息。


image.png

2、isa结构

image.png
image.png

三、Class结构

image.png

1、class_rw_t

image.png

2、class_ro_t

image.png

3、method_t

image.png

4、 Type Ecoding 类型编码 -了解

image.png

5、 cache_t 方法缓存

image.png

6、 散列表(哈希表)

是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组做散列表。


image.png
image.png

1、selector方法通过&一个mask值,得到一个key,例如是下标4,就将方法的实现放到下标是4的位置。
2、其他的方法一样,都找到一个下标去存放方法。
3、再次去调用的方法的时候,selector方法直接&一个mask值得到下标的值,直接取出方法调用。
4、没有用的位置先空着,这样会牺牲一点点内存,这是以牺牲空间来换时间的典型例子,提高了查找效率。

1、如果2个selector方法通过&一个mask的值是相同的怎么办?也就是产生了哈希冲突

如果方法1是4,方法2也是4,那么就让fang

2、如果空间不够了,会进行2倍扩容,再把原来的缓存清掉
image.png

7、消息发送objc_msgSend

OC方法其本质上就是通过调用objc_msgSend函数,给方法调用者发送消息。

//1.方法的调用
[person sayHello];
//2.消息发送
objc_msgSend(person, sel_registerName("sayHello")); 
image.png

8、动态方法解析

如果通过消息发送找不到方法,就会来到动态方法解析阶段


image.png

9、消息转发

动态方法解析找不动方法,就进入消息转发阶段,将消息转发给别人。


image.png

四、Super关键字

-(instancetype)init{
    
    if (self =[super init]) {
        
        NSLog(@"[self class] = %@",[self class]);
        NSLog(@"[super class] = %@",[super class]);
        NSLog(@"[self superclass] = %@",[self superclass]);
        NSLog(@"[super superclass] = %@",[super superclass]);
    }
    
    return  self;
}

打印结果:

2021-09-27 15:02:03.436819+0800 OCStudy[70570:3548911] [self class] = Student
2021-09-27 15:02:03.437072+0800 OCStudy[70570:3548911] [super class] = Student
2021-09-27 15:02:03.437281+0800 OCStudy[70570:3548911] [self superclass] = Person
2021-09-27 15:02:03.437470+0800 OCStudy[70570:3548911] [super superclass] = Person

self 和 super调用的结果是一样的

image.png image.png

相关文章

网友评论

      本文标题:iOS学习- Runtime -1

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