OC对象的本质

作者: 嗯o哼 | 来源:发表于2020-04-14 18:43 被阅读0次

    一、OC对象的底层实现

    Objective-C 底层是由C/C++的数据结构实现的。
    一个NSObject类对应C中的结构体类型

    //OC
    @interface NSObject{
      Class isa; // 包含一个isa指针
    }
    // 对应的 C
    struct NSObject_IMPL{
      Class isa;
    }
    // isa 本质就是一个指向 objc_class 结构体的指针
    typedef struct objc_class *Class;
    

    注意:isa的内存地址一直都在对象的起始位置,所以isa 的内存地址就是对象的内存地址,而isa中存放的地址值并不是对象本身的地址,切勿混淆!!!

    二、OC对象的分类

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

    1.类对象、实例对象

    实例对象是通过类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的值
    
    image.png

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

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

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

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

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

    2.类对象与元类对象

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

    元类对象在内存中存储的信息

    类的类方法信息
    

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

    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.实例对象存储实际的值可以有很多,类对象和元类对象内存中只存在一份

    思考:isa究竟是什么,在对象中起着什么样的作用,它的内部结果是什么样子的?
    

    isa的作用与内部结构(上)
    isa的作用与内部结构(下)

    相关文章

      网友评论

        本文标题:OC对象的本质

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