Objective-C中的对象之三种对象

135 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


Objective-C中的对象,简称OC对象,主要可以分为3种:

instance对象(实例对象)

class对象(类对象)

meta-class对象(元类对象)

第一种:instance对象

instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象

 // instance对象,实例对象

 NSObject *object1 = [[NSObject alloc] init];

 NSObject *object2 = [[NSObject alloc] init];

object1object2是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对象的示意图:

640.jpeg

640.png

以下代码获取的objectClass是class对象,并不是meta-class对象:

Class objectClass = [[NSObject class] class];