Runtime-为什么要设计metaclass

在Smalltalk里,万物皆对象;也是基于类的系统,意味着每个对象有与之对应的类——定义对象的结构和向对象发送消息。这意味着,在SmalltackClass是一个对象;一个类需要成为一个类(即元类 metaclass)的对象。

Smalltalk较早的版本,只有一个metaclass称为"Class"。所有类的方法是相同的,特别是创建新对象的方法,都是new。为了让类有自己的方法和实例变量(类实例变量不应该和类变量混淆),Smalltalk-80 开始,每个 Class C,属于它的 metaclass C class。意味着每个元类分享一个单例类Metaclass

Smalltalk 有两个主要的研究范畴:

  1. 编程语言是在人类思维和电脑硬件之间传递信息的一道桥梁(通常用 API 来呈现)
  2. 一门语言的交互(用户界面),使得人类通讯系统和电脑通讯系统匹配。

Objective-C类似于 Smalltalk,想了几天,浅薄理解如下,欢迎评论交流:

  1. 职责分离,不用所有的类方法都加到同一个类里
  2. objc_msgSend(void /* id self, SEL op, ... */ ) 复用消息通道,类方法也可以放在Class里,但发送消息时,需要增加一个参数
  3. 类方法不仅实现实现专门的实例化器(与其他一些面向对象语言的“构造函数”大致对应),且有利于类之间共享的行为
  4. smalltalk-76,类的类都是'Class',该类实现了任何类都需要的方法-eg. new方法。我们想添加一个类方法,必须添加到'Class'
  5. metaclass是 smalltack 中为数不多丑陋设计之一,好处是不需要了解工厂模式,类本身就能充当工厂。
  6. 对象的共享行为放在类里,类的共享行为放在元类里,只有一个元类就会像“第4条”一样,元类爆炸。

参考

  1. Why is MetaClass in Objective-C?
  2. https://en.wikipedia.org/wiki/Metaclass
  3. CSE 341: Smalltalk classes and metaclasses

你可能感兴趣的:(Runtime-为什么要设计metaclass)