OC

在 Objective-C(OC)中,类和类对象是两个密切相关的概念。它们的区别和相互关系主要体现在对象的创建、类方法调用、以及 OC 底层的运行时机制。

1. 类(Class)

  • 定义:类是 OC 中的核心概念,用于定义对象的行为和属性。它包含了实例变量、属性和方法。

  • 实例化:类是用来创建对象的模板,通过类可以实例化生成对象(实例),这些对象会拥有类中定义的属性和方法。

  • 定义示例

    @interface MyClass : NSObject
    @property (nonatomic, strong) NSString *name;
    - (void)printName;
    @end

2. 类对象(Class Object)

  • 定义:在 OC 中,每个类本身也是一个对象,称为“类对象”。类对象是表示某个类的元类(meta-class)的实例。

  • 存在意义:类对象的主要作用是响应类方法调用。类的实例方法由实例对象调用,而类方法则由类对象调用。

  • 创建时机:当程序启动或首次使用某个类时,运行时(runtime)会创建对应的类对象。

3. 类与类对象的关系

  • 类与类对象的区别

    • 是用于定义对象的蓝图,可以创建多个实例对象。

    • 类对象是代表某个类的单一对象,它管理该类的类方法和其他元信息。

  • 类的结构:类由以下几部分组成:

    • 实例变量:属于类的对象(实例)所拥有的数据。

    • 实例方法:只能通过对象调用的方法。

    • 类方法:可以直接通过类对象调用的方法,属于整个类,而不是某个实例。

4. 类方法与实例方法的区别

  • 实例方法:通过类的实例来调用,它们是操作具体对象的行为。

    MyClass *obj = [[MyClass alloc] init];
    [obj printName]; // 调用实例方法
  • 类方法:通过类对象来调用,通常用于创建对象或者执行不依赖具体实例的操作。

    @interface MyClass : NSObject
    + (void)classMethod;
    @end
    
    [MyClass classMethod]; // 调用类方法

5. 类对象的实现

在 OC 的底层,类对象是 Class 类型的对象。通过运行时函数 object_getClass() 可以获取某个对象的类,类本身的类对象是其元类(meta-class)。每个类对象都有指向其元类的指针,元类管理类方法,元类本身也是类,但它是唯一的,不再有元类。

Class cls = [MyClass class]; // 获取类对象
Class metaClass = object_getClass(cls); // 获取类的元类

6. 元类(Meta-class)

  • 元类的作用:元类是类对象的类。每个类对象都由元类实例化,元类负责处理类方法。

  • 继承关系:普通对象的类是它的类对象,而类对象的类是元类,元类的类最终指向根元类(NSObject 的元类)。

通过理解类与类对象,OC 的运行时系统显得更清晰,尤其是在类方法、实例方法的调用及类的继承层次上

Last updated