OC对象的种类:
- 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对象
Class objcClass1 = [object1 class];
Class objcClass2 = [object2 class];
Class objcClass3 = object_getClass(object1);
Class objcClass4 = object_getClass(object2);
Class objcClass5 = [NSObject class];
objcClass1~objcClass5都是NSObject的class对象(类对象)
它们都是同一个对象,每个类在内存中有且只有一个class对象
class对象在内存中存储的信息包括:
- isa指针
- superclass指针
- 类的属性(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)

三.meta-class对象
// 将类对象作为参数传入,获得元类对象
Class objcMetaClass = object_getClass([NSObject class]);
objcMetaClass是NSObject的meta-class(元类对象)
每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括:
- isa指针
- superclass指针
- 类的类方法信息(class method)

注意: 一下代码获取的objectClass是class对象,并不是meta-class对象
Class objectClass = [[NSObject class] class];
补充: 查看Class是否为meta-class
Class objcClass5 = [NSObject class];
BOOL result1 = class_isMetaClass(objcClass5); // NO
BOOL result2 = class_isMetaClass(object_getClass([NSObject class])); // YES
四.object_getClass内部实现
Class objc_getClass(const char *aClassName)
传入字符串类名
返回对应的类对象
Class object_getClass(id obj)
传入obj可能是instance对象、class对象、meta-class对象
返回值:
- 如果是instance对象,返回class对象
- 如果是class对象,返回meta-class对象
- 如果是meta-class对象,返回NSObject(基类)的meta-class对象
- (Class)class,+(Class)class
返回值就是类对象