OC对象主要分为3种:
-
instance对象(实例对象) -
class对象 (类对象) -
meta-class对象 (元类对象)
instance对象:
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
object1 和 object2是NSObject的instance对象
它们是两个不同的对象,分别占据两块不同的内存。
instance对象在内存中存储的信息:
-
isa指针 - 其他成员变量
class对象:
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = [NSObject class];
Class objectClass4 = object_getClass(object1); //Runtime API
Class objectClass5 = object_getClass(object2); //Runtime API
其中 objectClass1 ~ objectClass5都是NSObject的class对象
它们是同一个对象,每个类在内存中有且只有一个class对象
class对象在内存中存储的信息:
-
isa指针 -
superClass指针 - 类的属性信息(
@property)、类的方法信息(instance method) - 类的协议信息(
protocol)、类的成员变量(ivar) - 其他...
meta-class
Class objectMetaClass = object_getClass([NSObject class]); //Runtime API
objectMetaClass是NSObject的meta-class对象
每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象内存结构是一样的,但是用途不一样,在内存中存储的信息主要有:
-
isa指针 -
superClass指针 - 类的类方法信息(
class method) - 其他...
注意:
Class objectClass3 = [[NSObject class] class];
以上方式获取是类对象,不是元类对象,
BOOL result = class_isMetaClass([NSObject class]);
查看Class是否为meta-class