OC对象的分类

OC中的对象,主要可以分为三类:

instance对象

instance对象(实例对象)就是通过类alloc出来的对象,每次类调用alloc都会生成一个新的instance对象。instance对象在内存中存储的主要信息有:

  • isa指针
  • 其他类的成员变量(值)
1
2
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

obj1和obj2就是两个NSObject的实例对象,分别占据两块的不同的内存。

class对象

每个类在内存中有且只有一个class对象(类对象),class对象在内存中存储的主要信息有:

  • isa指针
  • superclass指针
  • 类的属性信息(@property)
  • 类的对象方法信息(instance method)
  • 类的协议信息(protocol)
  • 类的成员变量信息(类型,名称)

下面代码获取到的都是NSObject类对象:

1
2
3
4
5
6
7
8
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
Class objClass1 = [obj1 class];
Class objClass2 = [obj2 class];
Class objClass3 = [NSObject class];
Class objClass4 = object_getClass(obj1);
Class objClass5 = object_getClass(obj2);
Class objClass6 = objc_getClass("NSObject");

meta-class对象

每个类在内存中有且只有一个meta-class对象(元类对象)。meta-class对象和class对象的内存结构是一样的,但是用途不一样。meta-class对象在内存中存储的主要信息有:

  • isa指针
  • superclass指针
  • 类方法信息(class method)
  • ……

下面代码获取到的metaClass就是NSObject的meta-class对象:

1
Class metaClass = object_getClass([NSObject class]);

可以通过class_isMetaClass方法判断一个Class对象是否为meta-class对象。

需要注意的是,以下代码获取到的是Class对象,并不是meta-class对象:

1
Class objClass = [[NSObject class] class];

注意点

  1. Class objc_getClass(const char *aClassName)

    • 传入字符串类名
    • 返回对应的类对象
  2. Class object_getClass(id obj)

    • 传入的obj可能是instance对象、class对象、meta-class对象
    • 返回值如果是instance对象,返回class对象
    • 返回值如果是class对象,返回meta-class对象
    • 返回值如果是meta-class对象,返回NSObject(基类)的meta-class对象
  3. -(Class)class、+ (Class)class 返回的就是类对象