一、是什么
OC是一门动态性比较强的语言,跟C、C++有很大的不同
OC的动态性是由Runtime API来支撑的,Runtime API提供的接口都是C语言的,源码由C/C++/汇编编写。
Runtime 运行时,将尽可能多的决策从编译时和链接时推迟到运行时。
二、isa指针
1、是什么?
arm64之前,isa就是一个普通的指针,存储着class/meta-class对象的内存地址
![](https://img.haomeiwen.com/i1784598/80ca8d88e0107a9d.png)
arm64之后,对isa进行了优化,变成了一个共用体结构,还是用位域技术来存储更多的信息。
![](https://img.haomeiwen.com/i1784598/840b7ef9204181bd.png)
![](https://img.haomeiwen.com/i1784598/401bdc38262a84d8.png)
2、isa结构
![](https://img.haomeiwen.com/i1784598/ba9a2a7679d3bdb3.png)
![](https://img.haomeiwen.com/i1784598/85eb81ceba6d8136.png)
三、Class结构
![](https://img.haomeiwen.com/i1784598/5f7c6616827d4ce0.png)
1、class_rw_t
![](https://img.haomeiwen.com/i1784598/59adbb77cf7e3d1d.png)
2、class_ro_t
![](https://img.haomeiwen.com/i1784598/689e4e5eabd03f43.png)
3、method_t
![](https://img.haomeiwen.com/i1784598/6af49192c583d3af.png)
4、 Type Ecoding 类型编码 -了解
![](https://img.haomeiwen.com/i1784598/3700df51a400811e.png)
5、 cache_t 方法缓存
![](https://img.haomeiwen.com/i1784598/714e7e7487473df5.png)
6、 散列表(哈希表)
是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组做散列表。
![](https://img.haomeiwen.com/i1784598/9dc5b1865bcfc5ed.png)
![](https://img.haomeiwen.com/i1784598/31207f5d9290afb2.png)
1、selector方法通过&一个mask值,得到一个key,例如是下标4,就将方法的实现放到下标是4的位置。
2、其他的方法一样,都找到一个下标去存放方法。
3、再次去调用的方法的时候,selector方法直接&一个mask值得到下标的值,直接取出方法调用。
4、没有用的位置先空着,这样会牺牲一点点内存,这是以牺牲空间来换时间
的典型例子,提高了查找效率。
1、如果2个selector方法通过&一个mask的值是相同的怎么办?也就是产生了哈希冲突
。
如果方法1是4,方法2也是4,那么就让fang
2、如果空间不够了,会进行2倍扩容,再把原来的缓存清掉
![](https://img.haomeiwen.com/i1784598/b94a2264ed184420.png)
7、消息发送objc_msgSend
OC方法其本质上就是通过调用objc_msgSend函数,给方法调用者发送消息。
//1.方法的调用
[person sayHello];
//2.消息发送
objc_msgSend(person, sel_registerName("sayHello"));
![](https://img.haomeiwen.com/i1784598/15655c4dc1c4e0b6.png)
8、动态方法解析
如果通过消息发送找不到方法,就会来到动态方法解析阶段
![](https://img.haomeiwen.com/i1784598/dcffcda30320c461.png)
9、消息转发
动态方法解析找不动方法,就进入消息转发阶段,将消息转发给别人。
![](https://img.haomeiwen.com/i1784598/feab6adddff968b9.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调用的结果是一样的
![](https://img.haomeiwen.com/i1784598/9cac97595e6e31d6.png)
![](https://img.haomeiwen.com/i1784598/4ea007b6e0ee2b0c.png)
网友评论