Meta Class

文章目录
  1. 1. object 是 class 的实例
  2. 2. 每个 class 都继承自 Object
    1. 2.1. is-a 的含义
    2. 2.2. Object 的责任
  3. 3. class 是 metaclass 的实例
    1. 3.1. metaclasses 是隐式的
  4. 4. metaclass 和 class 的继承是平行的
  5. 5. metaclass 继承自 class 和 behavior
  6. 6. metaclass 是 Metaclass 的实例
  7. 7. Metaclass 的 metaclass 是 Metaclass 的实例
  8. 8. 为什么要有 MetaClass

smallTalk 中 Metaclass 的 7个要素

  1. object 是 class 的实例
  2. class 最终继承自 object
  3. class 是 metaclass 的实例
  4. metaclass 和 class 的继承是平行的
  5. metaclass 继承自 class 和 behavior
  6. metaclass 是 Metaclass 的实例
  7. Metaclass 的 metaclass 是 Metaclass 的实例

object 是 class 的实例

object 是 class 的实例

每个 class 都继承自 Object

实例对象的 class 都继承自 Object
objc_class: objc_object

is-a 的含义

当 Object 接收 msg 的时候,在他的 class 对象方法列表中找,一直沿着 superclasses ,知道 Object 对象查找这个消息
is-a用于查找消息

Object 的责任

  1. 描述 Object 的公共行为
    • error-handling, halting …
  2. 所有类最终都继承自 Object

class 是 metaclass 的实例

Class 也是对象:每个 class A 是他的 metaclass 的唯一实例,叫做 A class

metaclasses 是隐式的

  1. 当创建 class 的是时候,会隐式创建 Metaclass
  2. 没有共享的 metaclass(class 和 metaclass 是一一对应的)

metaclass 和 class 的继承是平行的

class 和 object 的一致性

  1. object 有的东西,class 也有
  2. 同样的方法查询策略
    1. object 在class 的 method 字典中查找
    2. class 在 metaclass 的method 字典中查找

metaclass 继承自 class 和 behavior

metaclass 是 Metaclass 的实例

Metaclass 的 metaclass 是 Metaclass 的实例

为什么要有 MetaClass

objc_class: objc_object, 所以object 有的东西 class 也有

  1. object 是 class 的实例,class 是 metaclass 的实例
  2. object 方法,属性,协议方法都保存在 class 对象中;class方法,属性,协议方法都保存在 metaclass 对象中
  3. class 是 object 的工厂,metaclass 是class 的工厂
  4. 因为class 继承自 object 所以消息查找方式相同

如果没有 metaclass 呢?

  1. smalltalk-76,类的类都是 Class ,该类实现了任何类都需要的方法-eg. new方法。如果想添加一个类方法,必须添加到 Class
  2. objc_msgSend(void /* id self, SEL op, … */) 复用消息通道,类方法也可以放在Class里,但发送消息时,需要增加一个参数