iOS底层

isa的初始化和指向

2019-12-20  本文已影响0人  xxxxxxxx_123

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==

上一篇下一篇

猜你喜欢

热点阅读