为什么实现接口的Delphi对象需要进行引用计数?

7
换句话说,为什么它们不能像普通对象一样手动管理?或者Delphi设计师只是决定使用引用计数,因为它在COM中已经需要了吗?

2
接口本身并没有干什么。由实现接口的类决定如何管理引用计数。不管怎样,新的基于LLVM的Delphi编译器也为对象引用引入了引用计数。 - Günther the Beautiful
1
@GünthertheBeautiful 这是真的。但所有 Delphi 接口都派生自 IInterface,因此分配引用会导致编译器生成对 _AddRef_Release 的调用。实现对象可能什么也不做,但这些调用仍然存在。这是不必要的事情,而且在 C 和 C++ 等语言中也没有这样的设计。 - David Heffernan
1
事实是,被引用计数的不是对象,而是接口。当然,对象也必须实现这部分内容,但是对AddRef和Release的调用通常在接口上,而不是对象上。 - Rudy Velthuis
1个回答

11
首先要明确的是,接口是为了支持COM而添加到Delphi中的。因此,许多设计决策都基于让COM编程更加容易的愿望。
接口引用可以很好地进行手动管理。实际上,在C和C++中的原始COM最初是涉及手动引用计数管理,并需要显式调用 AddRef 和 Release。当从C中使用COM对象时,仍然需要执行手动引用计数管理。对于C ++,通常使用类似 CComPtr 的类来启用自动引用计数管理。
在将COM支持添加到Delphi时,Delphi的主要竞争对手是VB。在VB中,您从未必须进行手动引用计数管理。如果Delphi设计者没有实现自动引用计数管理,那么要让VB程序员离开VB并开始使用Delphi会更加困难。所以我猜测这是Delphi设计师所做决策中的一个驱动因素。即使这不是这种情况,针对自动引用计数编码要比手动编程容易得多。因此,即使我的推测是错误的,Delphi设计师所做的决定也能让生活变得更简单。
因此,针对您的具体问题是:
“为什么它们不能像常规对象一样进行手动管理?”
它们可以。您可以实现 _AddRef 和 _Release,以使它们不控制对象的生命周期。具体而言,这些方法不一定要计算引用计数,也不一定要让_Release 调用 Free。
“Delphi设计师决定使用引用计数是因为它在COM中需要吗?”
嗯,并不需要用于COM。正如我上面所说,在C或C ++(或其他语言)中可以针对COM进行编码,而无需自动引用计数。

你可能会有另一个问题,为什么Delphi接口必须派生自IInterface。这源于它们最初的目的,即实现COM接口。在许多方面,如果我们可以拥有不从IInterface派生的接口会更好。但事实就是这样。


4
请注意,从TComponent派生的Delphi对象虽然可能实现任何接口,但其引用计数已被禁用。许多人之前已经要求编译器引入一个新的非引用计数接口类型,Embarcadero也意识到了这个问题。然而,它是否会被实现仍是未知数。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接