-
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
}
网友评论