OC对象的本质

作者: 小溜子 | 来源:发表于2020-08-13 18:11 被阅读0次

    一、OC对象的底层实现

    OC 中的代码在底层实现,使用的是 C、C++,所以要研究 OC 中的类结构,可以将 OC 的代码转成 C++的代码。

    //OC
    @interface NSObject{
      Class isa; // 包含一个isa指针
    }
    // 对应的 C
    struct NSObject_IMPL{
      Class isa;
    }
    

    其中 Class 的定义如下:

    typedef struct objc_class *Class;
    

    二、OC对象的分类

    OC对象分为三类:实例对象、类对象、元类对象

    我们知道实例对象是通过alloc init 出来的对象

    /*
       NSObject 类对象
       objc1 实例对象
       objc2 实例对象
    */
    NSObject *obj1 = [[NSObject alloc] init]; 
    NSObject *obj2 = [[NSObject alloc] init]; 
    

    思考:作为实例对象,它在内存中都存储了哪些信息,它与类对象有什么区别?

    我们可以通过初始化方法创建很多个实例对象,而实例对象与实例对象之间的关系
    1.都具有isa指针,isa的地址值不同
    1.他们的成员变量类型相同,而值可以不同
    2.具有相同的方法

    @interface Person:NSObject{
      int age;
    
    -(void)getAge;
    }
    
    Person *p1 = [[Person alloc] init]; // 实例对象p1具有自己的内存空间
    p1.age = 3; 
    [p1 getAge]; // 调用方法获取age的值
    Person *p2 = [[Person alloc] init];// p2也具有自己的内存空间
    p1.age = 4;
    [p2 getAge]; // 滴啊用方法获取age的值
    
    922910-7d5f8caadf6a8169.png

    它们有区别:

    1.内存中可以有多个实例对象,他们维护着自己的成员变量的值
    2.内存中只需要有一个相应的类对象,由它去维护公共的信息

    它们所存储信息:

    实例对象在内存中存储的信息主要包括

    1. isa指针
    2. 其他成员变量
    

    类对象在内存中存储的信息主要包括

    1. isa指针
    2. superclass指针
    3. 类的属性信息
    4. 类的对象方法信息
    5. 类的协议信息
    6. 类的成员变量信息
    7. 其他信息
    

    3.类对象与元类对象

    类对象存储的是实例对象的公共信息,元类对象存储的就是类对象的信息,它的数据结构与类对象一致,只是用途不一样
    元类对象在内存中存储的信息,如下:

    类的类方法信息
    

    类对象、元类对象的获取方式

    NSObject *obj = [[NSObject alloc] init];
    Class obj_class = [obj class]; // 返回类对象
    Class obj_class2 = [NSObject class]; // 类对象直接调用class方法
    //class 方法是oc的方法,重复调用此方法,返回的只是类对象
    Class obj_class_class = [[NSObject class] class]; //无论调用多少次,返回的依然是类对象
    // objec_getClass方法会根据传入的参数类型,返回类对象或者是元类对象
    Class obj_class3 = object_getClass(obj); // runtime api 返回类对象
    Class objc_class4 = object_getClass(obj_class);// 返回的是元类对象
    

    三、总结
    1.oc底层是由c/c++实现
    2.oc对象分为三类:实例对象、类对象、元类对象
    3.实例对象存储实际的值可以有很多,类对象和元类对象内存中只存在一份

    相关文章

      网友评论

        本文标题:OC对象的本质

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