美文网首页程序员
OC对象的分类

OC对象的分类

作者: coderLZ | 来源:发表于2018-03-20 10:28 被阅读0次

    写在前面

    一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。

    不晕的外圈

    OC 对象主要可分为三种:

    instance对象——实例对象

    就是通过类alloc出来的对象。
    每一个alloc出来的对象都是不同的对象,分别占据着不同的地址。

    实例对象在内存中存储的信息包括:
    -> isa指针
    -> 其他成员变量的值

    class对象——类对象

    每个类在内存中有且只有一个class对象。
    可以通过以下方式获得类对象

     Class cls1 = [p class];
     Class cls2 = [Person class];
     Class cls3 = object_getClass(p);
    

    类对象在内存中存储的信息主要包括:
    -> isa指针
    -> superclass指针
    -> 类的属性信息,类的对象放方法信息
    -> 类的协议信息、类的成员成员变量

    meta-class对象 ——元类对象

    每个类在内存中有且只有一个元类对象,可以通过以下方式获得:
    Class metaCls = object_getClass([Person class]);
    元类对象和类对象的内存结构是一样的,但用途不一样,元类对象在内存中存储的信息主要包括:
    -> isa指针
    -> 类方法信息

    注意:通过[NSObject class]class]是不能获得元类的!

    易晕的内圈

    那这三种对象是通过什么联系起来的呢:isa 和 superclass

    1

    instance的isa指向class,当调用对象方法时,通过instance的isa找的class,在class中找到对象方法的实现调用。
    class 的isa 指向meta-class,当调用类方法时,通过class的isa找到meta-class,在meta-class中找到类方法的实现调用。

    注:实例对象isa地址不是直接对应类对象的地址,类对象的isa地址也不是直接对应元类对象 的地址,在64bit开始,isa需要进行一次位运算才能计算出真正地址。

    2.png

    当Student的实例对象要调用Person的对象方法时,先通过isa找到Student的Class,然后通过Student的superclass找到Person的class,最后找到对象方法实现调用。


    3.png

    当Student的类对象调用Person的类方法时,先通过isa找到Student 的元类对象,在通过supercla找到Person的元类对象,最后找到方法实现调用。

    网上流传经典的关系图:


    4.png

    总结:
    instance的isa指向class

    class的isa指向meta-class

    meta-class的isa指向积累的meta-class

    class的superclass指向父类的class,没有父类的指向nil

    meta-class的superclass指向父类的meta-class
    基类的meta-Class的superclass指向基类的class

    instance调用对象方法的轨迹:isa找到class,方法不存在的话就通过superclass找父类

    class调用类方法的轨迹:isa找打meta-class,方法不存在的话就通过superclass找父类

    写在最后

    捋顺了这些知识点,再看到一些面试题的时候就能沉着应对了!

    相关文章

      网友评论

        本文标题:OC对象的分类

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