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]);

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

上一篇下一篇

猜你喜欢

热点阅读