gpt4 book ai didi

Delphi接口(interface)没有引用计数

转载 作者:行者123 更新时间:2023-12-03 14:43:05 25 4
gpt4 key购买 nike

阅读 Expert Delphi 书籍时,我发现了一些我无法理解的内容。作者使用以下代码创建了一个单元:

 IToDoData = interface //CRUD
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;

然后他决定使用DataModule并以这种方式实现上述接口(interface):

type
TDMToDo = class(TDataModule, IToDoData)
// ... other code ...
public
// IToDoData
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;

到目前为止一切顺利,但请注意,他没有放置TInterfacedObject,因此这里我们没有像 AddRef 等方法。我的猜测是上面的代码很好,但它必须包含在 try ...finally block 中。

在主窗体中(数据模块单元当然是uses子句)有一个这样的函数:

function TFormToDo.GetToDoData: IToDoData;
begin
if DMToDo = nil then
DMToDo := TDMToDo.Create(Application);
Result := DMToDo;
end;

上面的代码允许编写如下代码:

begin
GetToDoData.ToDoList(FToDos);

ListView1.BeginUpdate;
try
//populate the list
finally
ListView1.EndUpdate;
end;
end;

这不会产生内存泄漏吗?至少在 window 上是这样。我是delphi新手,所以我可能会失败,但我在网上读到Android和IOs有ARC,所以不用担心最后尝试。

Windows 没有 ARC,所以我必须使用 try ..finally,除非有像 TInterfacedObject 这样的实现(这里没有)。那么这是一个错误吗?

<小时/>

该应用程序是一个待办事项应用程序,您可以在其中编写/阅读/保存笔记。数据模块具有FireDAC访问组件,并且使用接口(interface)方法来访问数据库。这是为了保持 UI 和数据库内容之间的分离。

最佳答案

TDataModuleTComponent 后代,TComponent 实现 IInterface 及相关引用计数方法

  TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)

但是,TComponent 禁用了引用计数,并且可以手动或通过非 ARC 编译器上的所有权模型来管理组件。

更准确地说,TComponent 已禁用引用计数,除非它充当 Windows COM 对象的包装器。这里的情况并非如此。

在 ARC 编译器上,手动管理有点复杂 - 实际上是自动管理,因为如果您不允许通过所有权管理 TComponent 后代,则必须使用 DisposeOf 释放它们.

关于经典编译器上的引用计数,

TComponent 行为与 TInterfacedObject 行为不同。

在上面的情况下,不存在泄漏,因为Application拥有该数据模块,并且它将在所有编译器上适本地管理数据模块的生存期。

<小时/>

try...finally block 的存在不是为了内存管理,而是为了保护 BeginUpdate...EndUpdate 你必须离开 try...finally 在所有编译器上。

关于Delphi接口(interface)没有引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45664271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com