美文网首页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的初始化和指向

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