Smalltalk类的生命周期是什么?

问题描述 投票:1回答:1

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

我的假设是:

  • 由于您将消息发送到对象和类,它们必须是活动的并且在内存中才能应答它们
  • 通过向其类发送“新”消息实例化该对象,可以使该对象处于活动状态(从而进入内存并收听消息)

好吧,因此对象从其实例化开始还活着,直到垃圾回收将其杀死,或者您向其发送销毁消息(或它的类)

但是,如何实例化一个类以使其生动起来?您不能向某种元类发送新消息(如果是,则实例化元类的元元类是什么?)那么,类在默认情况下是否还活着?加载图像时,smalltalk库中的每个类都已加载到内存中?内存中确实有很多类吗?如果是这样,我如何才能在特定时刻查看内存中的类和对象?

smalltalk
1个回答
0
投票

每个Smalltalk都有一个ClassBuilder类,其实例旨在创建新的类。 ClassBuilder通过首先为要构建的类创建Metaclass来完成此操作,然后将类消息#new发送到Metaclass。然后是刚刚创建的Metaclass,它使用原始'New'创建了唯一的实例。

具有ClassBuilder的原因是,不仅可以创建类,还可以对其进行修改。例如,一个类可以与另一个类更改其超类,或保留它,但更改其实例的形状或自己的形状。

ClassBuilder负责所有细节,并且还负责在形状更改时重新编译实例或类方法。请注意,一个类的更改将影响其所有子类(如果有)。因此,该类所需的所有任务也需要在子类中进行。

此外,在必须将新类包含在Smalltalk字典中的意义上,以使其既可访问又可使用。最后请注意,在形状发生变化的情况下(这可能是明显的,也可能是修改超类的结果),必须迁移该类的现有实例,以使其符合新的形状。所有这些任务使在后台运行的过程变得不容易。但是,从将类定义消息一直发送到'New'原语以及现有实例的迁移开始,您就可以遵循它。

关于类收集垃圾的方式,这里没有什么特别的。 Smalltalk没有任何销毁消息。不再引用的对象准备好收集。甚至可以收集仍然可以引用的对象,就像两个对象相互引用但不是从“外部”(即从任何根)引用的情况一样。

之所以没有(容易)对类进行GC的原因是因为它们是从Smalltalk字典中引用的,该字典是系统的根源之一。当然,您可以手动删除一个类,这意味着它将从Smalltalk词典中删除。在那些情况下,环境将帮助程序员查找是否存在对Association的引用,该引用将类名绑定到其他类的类对象。该环境还将帮助程序员检查要删除的类是否具有实例或子类。同样,由于每个类都知道其子类,因此从那里引用了类,因此超类需要从其子类列表中删除该类,作为删除该类的过程的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.