Objective-C中的类与元类

面向对象中,会涉及到一个概念,元类。什么是元类?先看一段代码。

NSArray *arr = [NSArray array];

它是怎么运行的呢?

在底层的Runtime中,[receiver message]底层会调用id objc_msgSend(id self, SEL op, ...)。回顾一下id是什么

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

typedef struct objc_object *id;
//id指向一个对象,可以猜测[NSArray array]中的NSArray也是一个对象。

可NSArray怎么会是对象?这就要引出本文的另一个主角元类了。

元类

NSArray和arr一样,也是对象,叫做类对象

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

可以看到,Class中也有个isa指针,他的指向就是自身的元类。

元类是类对象的类,类对象是元类的实例。

基于这种设计模式,不难发现:

  1. 我们以前调用 “+” 开头的类方法实际是在调用元类的对象方法
  2. 由于每个类有且只有一个,所以每个类对象都是其对应元类的单例

那么,元类是对象吗?
答案是肯定的,元类是对象

如果元类也是对象,元类的类又是什么?
上一张网上的示意图

面向对象-类

以NSObject为例:

  1. 每个实例对象的类都是类对象,每个类对象的类都是元类对象,每个元类对象的类都是根元类(root meta class的isa指向自身)
  2. 类对象的父类最终继承自根类对象NSObject,NSObject的父类为nil
  3. 元类对象(包括根元类)的父类最终继承自根类对象NSObject。

由此可见,类与元类是一个闭环。

请我吃颗糖,鼓励我继续创作!