美文网首页iOS底层
isa的初始化和指向

isa的初始化和指向

作者: xxxxxxxx_123 | 来源:发表于2019-12-20 17:11 被阅读0次

struct objc_object {

    Class_Nonnull isa  OBJC_ISA_AVAILABILITY;

};

- (id)class {

return (id)isa;

}

isa 指向流程

LGPerson *object = [LGPerson alloc]; 

NSLog(@" %@",object);

根据object_getClass

当我们使用x/4gx  打印object 就会发现 

即可得到:子类的实例的isa指向子类 子类的isa指向子类的meta类 子类的meta类的isa指向根meta类

同理继续打印可得到:

父类的实例的isa指向父类 父类的isa指向父类的meta类 父类的meta类的isa指向根meta类

根类的实例的isa指向根类  根类的isa指向根类的meta类  根类的meta类的isa指向根meta类

延伸:

object_getClass(id obj)就是返回isa指针

object_getClass(id obj) 和 [obj class]的区别:

1、当obj是实例变量时,object_getClass(id obj) 和 [obj class]是一样的,均是获取当前obj的isa指针,指向类对象。

2、当obj为类对象时,object_getClass(id obj)返回的是类对象中的isa指针、即指向类的元类,[obj class]返回的是本身。

3、当obj为metaclass(元类)对象时,object_getClass(obj)返回元类对象中的isa指针,因为元类对象的isa指针指向根类,所有返回的是根类对象的地址指针;[obj class]返回的则是其本身

4、当obj为Rootclass(元类)对象时,object_getClass(obj)返回根类对象中的isa指针,因为跟类对象的isa指针指向root-meta-class(根元类),即返回的是根元类的地址指针;[obj class]返回的则是其本身

  id obj = [TestModel new];

  NSLog(@"===obj===%@==", obj); // 实例对象

// ===obj===<TestModel: 0x6000002416e0>==

  Class cls1 = object_getClass(obj); // 指向实例对象的isa指针,即为类对象

  Class cls2 = [obj class]; // 指向obj的isa指针,即为类对象

  Class cls3 = [TestModel class]; // 类对象

  NSLog(@"==cls1==%p==cls2==%p==cls3==%p==", cls1, cls2, cls3);

// ==cls1==0x10d2bb238==cls2==0x10d2bb238==cls3==0x10d2bb238==

  Class cls4 = object_getClass(cls2); // 指向类对象的isa指针,该指针指向cls2的元类 meta-class

  Class cls5 = [cls2 class]; // 指向类对象自己

  NSLog(@"==cls4==%p====cls5==%p==", cls4, cls5);

// ==cls4==0x10d2bb260====cls5==0x10d2bb238==

  Class cls6 = object_getClass(cls4); // 指向元类的isa指针,该指针指向元类的根类 root-meta-class

  Class cls7 = [cls4 class]; // 指向元类自己

  NSLog(@"==cls6==%p====cls7==%p==", cls6, cls7);

// ==cls6==0x10e26ae58====cls7==0x10d2bb260==

  Class cls8 = object_getClass(cls6); // 指向根元类的isa指针,即为root-meta-class

  Class cls9 = [cls6 class]; // 指向根元类自己

  NSLog(@"==cls8==%p====cls9==%p==", cls8, cls9);

// ==cls8==0x10e26ae58====cls9==0x10e26ae58==

相关文章

  • isa的初始化和指向

    struct objc_object { Class_Nonnull isa OBJC_ISA_AVAILAB...

  • 第一天重点图

    一、alloc 二、内存对齐 三、isa的初始化 & 指向分析

  • iOS-isa的初始化和指向

    isa的初始化和指向 什么是isa isa是所有类结构体的第一个成员变量,被注释类说明是继承于objc_objec...

  • isa的初始化和指向分析

    isa的初始化 isa的初始化流程代码 问题解释:为什么赋值了cls之后就不赋值bits了? 原因是:isa是一个...

  • isa -初始化和指向浅析学习

    isa: 对象的第一个属性必然是isa ,来源是继承NSObject ---初始化isa isa < -----...

  • isa的流程和类的继承

    isa的指向流程: NSObejct:实例对象的isa指向 元类,元类的isa指向根元类,根元类的isa指向自己 ...

  • ISA指向、类结构

    ISA指向、类结构 1.ISA指向 上次在对象本质和ISA指针[https://www.jianshu.com/p...

  • isa初始化&指向分析

    探索对象与类如何绑定在一起 在objc4的源码中,通过研究alloc的流程就可看到下面的代码 上面的代码我们可以看...

  • isa的初始化&指向分析

    一、isa的初始化 首先从源码中找到类Class的定义和结构 继续找objc_class 继续找objc_obje...

  • isa的初始化&指向分析

    在探索alloc&init一篇中,我们对alloc&init有了初步的了解,其中包括对isa的初始化,本篇我们进一...

网友评论

    本文标题:isa的初始化和指向

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