美文网首页
iOS运行时中isa指针的本质

iOS运行时中isa指针的本质

作者: MiniCoder | 来源:发表于2020-03-08 21:11 被阅读0次

在OC中,因为类也是一个对象,所以也必须是另外一个类的实例,这个类就是元类(metaclass)。元类保存了类方法的列表。当一个类方法被调用的时候,元类会首先查找他本身是否有该方法的实现,如果没有,则元类会向他的父类查找方法,这样就可以一直找到继承链的头。
元类也是一个对象,元类的isa指针又指向哪里呢?为了设计的完整性,所有的元类的isa指针都会指向一个根元类。根元类的isa指针又会指向他自己,这样就形成了一个闭环


1981114-5036d6de4e94ce44.png

Class是一个指向objc_class(类)结构体的指针,而id是一个指向objc_object(对象)结构体的指针。
objc_object(对象)中isa指针指向的类结构称为objc_class(该对象的类),objc_class存放着普通成员变量与对象方法 (“-”开头的方法)。
objc_class(类)中isa指针指向的类结构称为metaclass(该类的元类),其中存放着static类型的成员变量与static类型的方法 (“+”开头的方法)。

从这里可以知道,OC的类其实也是一个对象,一个对象就要有一个它属于的类,意味着类也要有一个 isa 指针,指向他所属的类。那么元类的类是什么?就是我们所说的元类 (MetaClass) ,所以,元类就是类所属的类。从消息机制的层面来说:

当你给对象发送消息时,消息是在寻找这个对象的类的方法列表 。
当你给类发消息时,消息是在寻找这个类的元类的方法列表。
下面通过代码我们可以看一下详细的指向过程

   Person *p = [Person new];
    Class cls = object_getClass(p);
    //metaClass
    Class metaCls1 = object_getClass(cls);
    Class metaCls2 = object_getClass(metaCls1);
    Class metaCls3 = object_getClass(metaCls2);
    Class metaCls4 = object_getClass(metaCls3);
    Class class =  metaCls4;
    NSLog(@"实例 = %p ,类对象 =  %p,元类=  %p,根元类=  %p,根元类=  %p",p,cls,metaCls1,metaCls2,metaCls3);

实例 = 0x6000001a2440 ,类对象 =  0x107541bb8,元类=  0x107541be0,根元类=  0x7fff89e06698,根元类=  0x7fff89e06698

我们可以在类中找到实例对象的方法,也就是我们,在元类中找到类对象方法,也就是我们用到的+号方法。

相关文章

  • iOS运行时中isa指针的本质

    在OC中,因为类也是一个对象,所以也必须是另外一个类的实例,这个类就是元类(metaclass)。元类保存了类方法...

  • Objective-c isa、superclass指针深究,元

     研究iOS isa指针本质需要要了解类的本质和结构,我们都知道iOS的对象基本都是基于NSObject的子类。我...

  • iOS原理(五)----block

    iOS原理(五)----block block的本质 block本质上也是一个OC对象,它内部也有个isa指针, ...

  • OC对象的本质(下)

    iOS | OC对象本质 | Objective-C OC对象的分类,对象的isa指针指向哪里,superClas...

  • 4-1 内存管理

    1.内存布局 2.iOS内存管理方案 [isa指针保存了内存管理的信息] 2.iOS内存管理方案 [isa指针...

  • iOS-Runtime01-基础结构isa以及相关知识(位运算、

    在笔者编写的iOS-Objective-C的本质中,我们已经了解到,所有的OC对象本质中都包含了一个isa指针,这...

  • OC中类的本质

    OC中的对象的本质 对象本身是一个含有isa指针的结构体,isa指针指向对象所属的类类的本质:类本质也是一个结构体...

  • iOS底层原理-Block

    Block Block定义及本质 block本质上也是一个OC对象,它内部有个isa指针(有isa指针就可以认为是...

  • 【iOS】类的本质与isa指针

    类本身也是一个对象,是class类型的对象. objc_class结构体的定义: 假设我们创建一个Person类:...

  • OC对象的本质

    OC对象的本质 一个对象的本质是一个结构体,结构体里面有isa指针、成员变量等,isa指针指向对象的类别,inst...

网友评论

      本文标题:iOS运行时中isa指针的本质

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