首页 > 解决方案 > Smalltalk 类的生命周期是什么?

问题描述

我想知道一个类(或对象)的生命周期是什么,我的意思是,当它进入内存并活着回答消息直到最终从内存中删除时。

我的假设是:

好的,所以一个对象从它的实例化开始一直是活动的,直到垃圾收集杀死它或者你向它发送一条销毁消息(或者它的类)

但是,你如何实例化一个类来让它活着呢?你不能向一种元类发送新消息(如果是,实例化元类的元元类是什么?)那么,类默认情况下是活动的吗?加载图像时,smalltalk库中的每个类都加载到内存中?真的是很多课都在记忆中吗?如果是这样,我怎样才能在某个时刻看到内存中的类和对象?

标签: smalltalk

解决方案


正如 Leandro 和 Bert 所描述的,您可以发送new到元类。这创建的循环引用有点难以思考,但它们代表了设计和实现的“简单”和“优雅”(在旁观者的眼中美丽!)。我在下面附上了一张图,展示了它是如何工作的。Metaclass特别注意和之间的循环Metaclass class

  • 问:那么,类是默认活着的吗?
  • A:是的,如果它们作为物体存在于图像中,那么它们就是“活的”。
  • 问:smalltalk 库中的每个类都在加载图像时加载到内存中?真的是很多课都在记忆中吗?
  • A:是的,图像中的每个类都在内存中。很多吗?它可能需要几兆字节;这就是您从方言提供者那里获得的“基本”图像中的内容。考虑到 Chrome 使用的内存,Smalltalk 实际上相当适中!
  • 问:如果是这样,我怎样才能在某个时刻看到内存中的类和对象?
  • 答:类层次结构浏览器显示可从选定根(通常是 Smalltalk 字典)访问的类。较低级别的替代方法是使用Metaclass allInstances.

另请注意,虽然大多数 Smalltalks 都有 ClassBuilder,但并非所有都这样做(GemStone 没有),并且它的属性和行为可以折叠到 Behavior 中。

附加问题:

  • 问:如果我想要更小的图像怎么办?
  • A: 有多种 Pharo 图像可用,有些少(无 GUI),有些多。您还可以自由“卸载”任何不需要的包并保存您的图像。您还可以从“最小”图像开始并加载您需要的东西。是的,这与每次创建时都是空的基于 C 的语言(和其他语言)不同。主要的实际效果是您在图像中寻找事物,而不是在图像之外寻找事物。如果您发现您在限制为 1-2 MB 的环境中运行,那么这可能不适合您。Smalltalk 的优势在于程序员的生产力。组装的优点是体积小,速度快。你想解决什么问题?
  • 问:粉色方块是什么?
  • A:粉红色方块中的所有东西都附加了名称“class”。粉红色方块中的所有框都是元类的实例(跟随右侧的绿色“是一种”行)。
  • 问:告诉我更多关于继承的信息。
  • 答:在任何 OO 系统中,类都描述了对象的属性和行为。继承意味着超类的属性和行为也是对象性质的一部分。Person 类直接通过 Object 类和 Class 继承自 ClassDescription。作为 Metaclass 的实例不提供继承。相反,它提供了一个描述类创建属性和行为的地方。所以,是的,Object 是“Object 类”的一个实例(是一种),它描述了如何创建 Object 的实例。而且,不,Object 不是“Object 类”的特化(继承自)。Object 的实例不知道如何创建 Object 的实例;这就是Object类(工厂)的作用。

在此处输入图像描述


推荐阅读