美文网首页iOS Interview
Runtime-为什么要设计metaclass

Runtime-为什么要设计metaclass

作者: iOS小虫下米 | 来源:发表于2020-03-13 16:39 被阅读0次

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

    在Smalltalk里,万物皆对象;也是基于类的系统,意味着每个对象有与之对应的类——定义对象的结构和向对象发送消...

  • 为什么要设计metaclass

    源代码来自objc-750 __objc_msg发送 ENTRY _objc_msgSendUNWIND _obj...

  • 结构模型

    结构模型 介绍下runtime的内存模型(isa、对象、类、metaclass、结构体的存储信息等) 为什么要设计...

  • 学习历程(然而还是面不过)

    学而不思则罔,思而不学则殆。正如学习了 MetaClass,却不思考苹果为何要设计MetaClass 好记性不如烂...

  • iOS底层问题

    1.介绍下runtime的内存模型(isa、对象、类、metaclass、结构体的存储信息等 2.为什么要设计me...

  • Runtime-原理

    runtime初探对象与方法的本质runtime-消息发送runtime-动态方法解析runtime-消息转发 r...

  • Why is MetaClass in Objective-C?

    这篇文章源于美团面试官问的我一个问题,为什么Objective-C中有Class和MetaClass这种设计?去掉...

  • runtime-整理中

    runtime-整理中

  • isa与meta class

    isa 类的实例对象-》class-〉metaclass metaclass 》root meta class r...

  • 面试常考(python)

    Python语言特性 1.Python的函数参数传递 2.元类 metaclass metaclass 允许创建类...

网友评论

    本文标题:Runtime-为什么要设计metaclass

    本文链接:https://www.haomeiwen.com/subject/fbfjdhtx.html