美文网首页
iOS底层之isa走位探索

iOS底层之isa走位探索

作者: 当沉默已成习惯 | 来源:发表于2020-09-12 19:18 被阅读0次

前置文章: iOS底层之类的重要组成部分-isa结构体分析

前言

从上篇文章中我们得知对象的isa指针中的shiftcls存储的是类指针的值,那么这个值到底代表什么呢,接下来让我们探索一下。

一、isa指针探索

首先我们先用对象的isa指针 & ISA_MASK得到如下结果:

isa指针的shiftcls的值 看到这里打印的是WJPerson,那么这个WJPerson会不会是类的地址的,接下来我们打印下WJPerson的类地址再来验证一下 WJPerson类的地址 通过打印类的地址我们发现和我们上面获取到的isa的指针的shiftcls的结果一模一样,而shiftcls存储的又是类指针的值,所以我们可以得出结论:对象的isa指针指向的是类对象
那么类对象的isa指针指向什么呢?我们再来实验一下
类对象的isa指针结果 从上图中我们发现这里有打印了一次WJPerson,但是这个WJPerson和第一次打印的WJPerson的指针不一样,怎么回事,难道OC会创建两个一模一样的类吗?我们来测试下
void testClassPoint(){
    Class class1 = [WJPerson class];
    Class class2 = [WJPerson alloc].class;
    Class class3 = object_getClass([WJPerson alloc]);
    Class class4 = [WJPerson alloc].class;
    NSLog(@"\n%p \n%p \n%p \n%p", class1, class2, class3, class4);
}

打印结果

0x100002140 
0x100002140 
0x100002140 
0x100002140

从上述结果可知,OC只会存在一个类。那么我们之前获取到的第二个WJPerson是什么呢?
有的同学可能会知道在OC中还有一个元类的概念,元类有些相似,我们知道是使用存储对象信息的,那么元类就是存储类对象信息的类。说了这么多,空口无凭,我们再来验证下

验证元类地址 从上图中可以看出这两个地址一模一样,由此可以得出结论:类对象的isa指针指向元类
接下来我们再看下元类isa指针指向什么。
元类的isa指向 从上图中可以看到这里打印的是NSObject,那么这个NSObject是到底是还是元类,接下来我们打印下NSObject元类的地址 NSObject类和元类的地址 因为类只能存在一份,所以我在这里获取类和元类的地址时使用alloc重新创建一个对象获得的地址也一样。从图中我们发现WJPerson的元类的isa指针指向的是NSObject的元类。我们一般把NSObject叫做根类,那么NSObject的元类就叫做根元类。所以我们可以得出结论:元类的isa指针指向的是根元类
我们在看下根元类的isa指向的是什么。
根元类的isa指向 由图中我们可以得出结论:根元类的isa指针指向的是本身,这样就形成了一个闭环。
我们总结一下我们的验证结果
  • 对象的isa指针指向的是类对象
  • 类对象的isa指针指向元类
  • 元类的isa指针指向的是根元类
  • 根元类的isa指针指向的是本身
最后得出一张非常经典的图 isa走位图

相关文章

  • iOS底层之类结构分析

    上篇文章: iOS底层之isa走位探索 前言 从上篇文章中我们了解了对象的isa指针的走位逻辑,接下来咱们分析一下...

  • iOS底层之isa走位探索

    前置文章: iOS底层之类的重要组成部分-isa结构体分析 前言 从上篇文章中我们得知对象的isa指针中的shif...

  • iOS底层探索--isa位域

    我们知道isa在OC的底层随处可见,非常经典的一个图是isa的走位图,可查看这篇文章:iOS底层探索--OC对象的...

  • iOS底层-类的探索分析之cache

    前言 前面两篇文章我们介绍了isa,继承链(iOS底层-类的探索分析之isa及继承链[https://www.ji...

  • iOS底层探索之isa

    一、前置知识 1.1 C 共用体 || 联合体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类...

  • iOS底层-类的探索分析之类的属性及类的方法

    序 iOS底层-类的探索分析之isa及继承链[https://www.jianshu.com/p/17a5e683...

  • iOS底层探索之对象原理(三)

    前言 iOS底层探索之对象原理(二)我们了解到 isa是一个联合体位域,ISA_BITFIELD存储了类的一些信息...

  • iOS底层探索004-类分析

    iOS底层探索-目录 1. 类的分析 主要分析两个部分:isa的走向和继承关系 isa分析 类的isa走向,参考这...

  • iOS底层-isa结构(isa_t)

    在iOS 底层-- isa指向探究中探索了isa的指向,那么isa的结构具体是什么样的。从源码中来着手研究。 一、...

  • OC对象底层探索 — alloc创建对象

    用于记录iOS底层学习,以备后续回顾 OC对象底层探索alloc创建对象由字节对齐到对象内存大小探索isa的初始化...

网友评论

      本文标题:iOS底层之isa走位探索

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