OC对象

作者: 陈盼同学 | 来源:发表于2021-01-25 11:19 被阅读0次

    https://opensource.apple.com/tarballs/objc4/

    引出以下论证由OC的类信息存放在哪里?

    答:成员变量的具体值存放在instance对象
    对象方法、协议、属性、成员变量信息存放在class对象
    类方法信息存放在meta-class对象

    Objective-C中的对象简称oc对象,主要分为三种
    1,instance对象 (实例对象)
    2,Class (类对象)
    3,meta-class对象 (元类对象)

    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象

    NSObject *object = [[NSObject alloc] init];
    object是NSObject的instance对象(实例对象)
    
    NSObject *object1 = [[NSObject alloc] init];
    NSObject *object2 = [[NSObject alloc] init];
    object1、object2是NSObject的instance对象(实例对象)
    它们是不同的两个实例对象,分别占据着两块不同的内存
    

    instance对象在内存中存储的信息包括

    isa指针
    其他成员变量(比如值)

    //以下俩为实例对象
    NSObject *object1 = [[NSObject alloc] init]; //object1是instance对象
    NSObject *object2 = [[NSObject alloc] init];//object1是instance对象
    

    Class对象

    //以下objectClass1 - objectClass5都可以称为NSObject的Class对象(类对象),他们是同一个对象(都是NSObject类对象),内存地址也是一样的。每个类在内存中有且只有一个Class对象
    Class objectClass1 = [object1 class];   //点击Class看到定义为typedef struct objc_class *Class;
    Class objectClass2 = [object2 class];
    Class objectClass3 = [NSObject class];
    //object_getClass 传参是instance对象(即实例对象)运行时获取类对象
    Class objectClass4 = object_getClass(object1);
    Class objectClass5 = object_getClass(object2);
    

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

    isa指针
    superclass指针
    类的属性信息(@property)
    类的对象方法信息(instance method,即-方法)
    类的协议信息(protocol)
    类的成员变量信息(ivar)
    ......

    类的成员变量信息存放在类对象里面(比如成员变量的叫什么名字,什么类型), 但是成员变量的值是放在实例对象的内存中(因为不同的实例对象可以给成员变量赋不同的值)

    meta-class

    //获取元类对象 类型也是Class
    Class objectMetaClass = object_getClass([NSObject class]);
    //传参是instance对象(即实例对象)运行时获取类对象,传参是类对象时获取的是meta-class(元类对象)
    

    每个类在内存中有且只有一个元类对象,元类对象和类对象的内存结构是一样的但是用途不一样,在内存中存储的信息包括

    元类对象在内存中存储的信息包括:
    isa指针
    superclass指针
    类的类方法信息(class method,即+方法)
    ......

    注意

    Class objectClass6 = [[NSObject class] class]; //获取的依旧是NSObject的类对象
    
    
    //利用runtime检测一个对象是否是元类对象 (需导入runtime头文件)
    BOOL result = class_isMetaClass([NSObject class]);
    

    元类对象可以认为是一种特殊的类对象

    相关文章

      网友评论

          本文标题:OC对象

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