美文网首页
对象的分类

对象的分类

作者: biu_iOS | 来源:发表于2022-02-21 16:23 被阅读0次
    对象的分类

    对象分为 实例对象、类对象、元类对象

    对象的数据结构
    1. 实例对象
    @interface Father : NSObject {
        int _age;
    }
    @end
    

    转化成c++代码以后可以发现

    struct Father_IMPL {
        Class isa;
        int _age;
    };
    

    可以发现 实例对象的本质是结构体,(在c++文件中查找类名_IMPL就能找到这个结构体),里面有一个isa指针和其他成员变量。所以实例对象在内存中存储的内容是 isa指针 + 其他成员变量具体值

    1.isa是什么? isa是一个指向类对象的指针(实例对象的isa指向类对象)
    2.每个实例对象会存储成员变量的值
    3.每一个实例对象是唯一的

    那方法是存储在哪的呢 我们在Father里加一个属性

    @interface Father : NSObject {
        int _age;
    }
    @property (nonatomic, assign) int height;
    @end
    

    那么转成c++ 是什么样的呢?

    struct Father_IMPL {
        Class isa;
        int _age;
        int _height;
    };
    
    2. 类对象

    同一个类是一个对象 每个类在内存中有且只有一个class对象
    所以类对象存储的都是一些公共的信息 数据结构

    class对象在内存中存储的信息主要包括
    isa指针 (指向元类对象)
    superclass指针 (指向父类的类对象)
    类的属性信息(@property)、类的对象方法信息(instance method)
    类的协议信息(protocol)、类的成员变量信息(ivar)...


    235845499_11_20211213082128771.jpg
    成员变量的值时存储在实例对象中的,因为只有当我们创建实例对象的时候才为成员变赋值。但是成员变量叫什么名字,是什么类型,只需要有一份就可以了。所以存储在class对象中
    3.元类对象
    Class objectMetaClass = object_getClass([NSObject class]);
    

    objectMetaClass是NSObject的meta-class对象(元类对象)
    每个类在内存中有且只有一个meta-class对象

    meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
    isa指针
    superclass指针
    类的类方法信息(class method)
    ......


    235845499_12_20211213082129177.jpg
    meta-class对象和class对象的内存结构是一样的,所以meta-class中也有类的属性信息,类的对象方法信息等成员变量,但是其中的值可能是空的。
    superclass指针
    WeChat7a9f96df24d38b17a577f7f2d5f1ad85.png
    对isa、superclass总结

    instance的isa指向class
    class的isa指向meta-class
    meta-class的isa指向基类的meta-class,基类的isa指向自己 (为什么?)
    class的superclass指向父类的class,如果没有父类,superclass指针为nil
    meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class
    instance调用对象方法的轨迹,isa找到class,方法不存在,就通过superclass找父类
    class调用类方法的轨迹,isa找meta-class,方法不存在,就通过superclass找父类

    相关文章

      网友评论

          本文标题:对象的分类

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