【发布时间】:2013-12-21 14:39:11
【问题描述】:
如果我在诸如TMyForm = class(TForm, IMyInterface) 这样的表单上实现一个接口,当没有更多的接口引用时,该对象是否会自行释放?似乎没有,尽管我无法弄清楚 TForm 是如何被引用计数的(如果有的话)。我担心当接口引用超出范围时表单会被释放,但这似乎没有发生。
我想这个问题有两个部分,首先是表单是否会被意外释放(真正的问题),其次是表单是如何被引用计数的。
【问题讨论】:
-
@TLama TForm 继承自 TComponent,它实现了 IInterface 和 IInterfaceComponentReference。 TComponent 确实实现了 _AddRef 和 _Release,但它们似乎只是有条件地进行引用计数。
-
@Alister:
TComponent禁用对自身的引用计数,但会对其VCLCOMObject属性执行引用计数(如果已分配)。 -
@Alister,对不起,也许我误解了你的问题(在重读几次之前),但我想你是在问如果你添加一个接口会发生什么(将在@987654324 中实现@ 班级)。如果添加该接口在某种程度上是危险的,并且如果这会向表单添加引用计数。
-
@TLama:向
TForm添加接口不会向TForm添加引用计数。编译器仍会在交互指针上调用_AddRef()和_Release(),但由于TComponent,它们将是无操作的。 -
没那么简单,@Free。看看其他人在这里写了什么。特别是,Remy 在您之前的评论,Uwe 的回答,以及问题中报告它没有那样工作的地方。