美文网首页
OC 的三种对象类型

OC 的三种对象类型

作者: 游城十代2dai | 来源:发表于2020-04-05 15:52 被阅读0次
  • instance 对象, 存放着其成员变量的具体值, 以及 isa
  • class 对象, 存放着成员变量, 属性, 协议, 对象方法, isa, superclass
  • meta-class 对象, 描述 class 的内容, 与 class 对象的内存结构一样, 抽象概念, 存放着类方法和 isa, superclass

三种对象层次递进, 下面是代码和 log 的信息

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

// 三种对象类型
void instance_class_metaclass(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        instance_class_metaclass();
    }
    return 0;
}

void instance_class_metaclass() {
    /**
     * instance 对象
     * 存放着其成员变量的具体值, 以及 isa
     */
    NSObject *objc1 = NSObject.alloc.init;
    NSObject *objc2 = NSObject.alloc.init;
    
    NSLog(@"instance - %p %p", objc1, objc2);
//    log: 如下地址所示, 每一次 alloc 就是一个新的实例对象
//    instance - 0x10048ad10 0x10048a8a0
    
    /**
     * class 对象
     * 存放着成员变量, 属性, 协议, 对象方法, isa, superclass 等
     */
    Class objcClass1 = objc1.class;
    Class objcClass2 = objc2.class;
    Class objcClass3 = NSObject.class;
    Class objcClass4 = object_getClass(objc1);
    
    NSLog(@"class - %p %p %p %p", objcClass1, objcClass2, objcClass3, objcClass4);
//    log: 如下地址所示, 以上方式获取到的 class 对象都是同一个
//    class - 0x7fff92a39118 0x7fff92a39118 0x7fff92a39118 0x7fff92a39118
    
    /**
     * meta-class 对象
     * 描述 class 的内容, 与 class 对象的内存结构一样, 抽象概念, 存放着类方法和 isa, superclass 等
     */
    Class objcMetaClass1 = object_getClass(objcClass1);
    Class objcMetaClass2 = [objcClass1 class];
    
    NSLog(@"objcMetaClass - %p %p \n objcMetaClass2 is meta-class: %d", objcMetaClass1, objcMetaClass2, class_isMetaClass(objcMetaClass2));
//    log: 如下地址所示, class 方法只能获取到 class 对象, 而获取不到 meta-class
//    objcMetaClass - 0x7fff92a390f0 0x7fff92a39118
//    objcMetaClass2 is meta-class: 0
}

相关文章

网友评论

      本文标题:OC 的三种对象类型

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