iOS底层原理 - OC对象的分类

294 阅读2分钟

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

返回值就是类对象