小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Objective-C中的对象,简称OC对象,主要可以分为3种:
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)
第一种:instance对象
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
// instance对象,实例对象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
object1、object2是NSObject的instance对象(实例对象)
它们是不同的两个对象,分别占据着两块不同的内存。
instance对象在内存中存储的信息包括:
isa指针
其他成员变量
\
第二种:class对象
// class对象,类对象
// class方法返回的一直是class对象,类对象
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = object_getClass(object1);
Class objectClass4 = object_getClass(object2);
Class objectClass5 = [NSObject class];
objectClass1 ~ objectClass5都是NSObject的class对象(类对象)
它们是同一个对象。每个类在内存中有且只有一个class对象。也就是说当你打印class对象的时候,他们具有相同的地址。
class对象在内存中存储的信息主要包括:
isa指针
superclass指针
类的属性信息(@property)
类的对象方法信息(instancemethod)
类的协议信息(protocol)
类的成员变量信息(ivar)
(这里的成员变量,是指成员变量的类型,名字等描述信息,存储的并不是成员变量的值。)
......
第三种:meta-class对象
Class objectClass5 = [NSObject class];
// meta-class对象,元类对象
// 将类对象当做参数传入,获得元类对象
Class objectMetaClass = object_getClass(objectClass5);
NSLog(@"objectMetaClass - %p %d", objectMetaClass, class_isMetaClass(objectMetaClass));
objectMetaClass是NSObject的meta-class对象(元类对象)
每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括:
isa指针
superclass指针
类的类方法信息(classmethod)
......
meta-class对象和class对象的内存结构是一样的,他们共用一个结构体。以下是:class对象和meta-class对象的示意图:
以下代码获取的objectClass是class对象,并不是meta-class对象:
Class objectClass = [[NSObject class] class];