OC对象
2021-01-25 本文已影响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]);
元类对象可以认为是一种特殊的类对象