如果一切都实现了接口,这会是垃圾收集吗?

Al *_*l C 7 delphi interface

我仍然是一个新手,我知道我的想法是不正确的; 我只是不知道在哪里 ......

几乎所有Delphi中的东西都来自TObject.如果所有内容都来自实现某些简单接口的TInterfaceObject(例如,"INamable",使用返回类名称字符串的单个方法),该怎么办?由于TObject已经有一个返回名称字符串的属性,因此您不需要向其他类添加任何内容.

换句话说,TInterfacedObject将从TObject(或层次结构中的高处)继承,并且当前从TObject继承的所有内容现在将从此新类继承.这是不是意味着现在一切都被引用了?

如果你能发现我缺乏知识的地方,我很乐意学习.谢谢,一如既往 - Al C.

Chr*_*isW 8

目前尚不清楚你是否在问:

  • 当Borland最初开发Delphi时,他们为什么不这样做?
  • 为什么Embarcadero不会在Delphi的未来版本中这样做?
  • 为什么我不使用自己的用户数据类型?

这是不是意味着现在一切都被引用了?

是的,它会的.

但是,您不一定要重写所有内容:每个小整数,每个字符串,每个布尔值,数组中的每个元素......如果没有其他原因,引用计数的实现会增加一些开销,例如每个对象有一点额外的内存,对于大型对象来说可能是微不足道的,但如果应用于每个微小的对象,则相对更重要.

另请参阅垃圾收集器对于Delphi对象和组件的说法(引用),

Delphi提供三种对象管理方式:

  1. 使用try..finally创建/销毁对象.
  2. 使用TComponent后代 - 创建一个组件并让其所有者释放它.
  3. 接口 - 当接口的引用计数变为0时,实现它的对象将被销毁.

Delphi帮助说你不应该将TComponent所有者方法与接口内存管理混合,但......

这会是垃圾收集吗?

不完全的; 仅仅引用计数不像垃圾收集那样健壮:

  • 使用引用计数,如果您有两个引用计数实例,每个实例持有对另一个的引用,则它们不会自动释放.要释放它们,您需要打破这个"循环引用"(即明确告诉其中一个释放它对另一个的引用).

  • 通过真正的垃圾收集,垃圾收集器会注意到这两个不是从其他任何地方引用,并释放它们.

更新
如果您将潜在的循环引用注释为[weak]引用,那么它们将被销毁.但在Delphi 10.1 Berlin之前,这只适用于NexGen编译器(即那些使用LLVM的编译器).从柏林10.1开始,这些[weak]参考文献无处不在.


Mas*_*ler 5

它不会工作垃圾收集,因为接口使用一个非常简单的引用计数系统,并且在Delphi代码中非常常见的循环引用打破了简单的引用计数.