gpt4 book ai didi

delphi - 使用 ARC 与不使用 ARC 释放接口(interface)对象 - Delphi

转载 作者:行者123 更新时间:2023-12-03 15:58:10 27 4
gpt4 key购买 nike

我正在开发一个项目,其中有一个如下所示的接口(interface) TRectangle:

IBoardShape = interface(IInterface)
function GetColor: integer;
procedure SetColor(const aColor: integer);
property Color: integer read GetColor write SetColor;
end;

TGameRectangle = class(TRectangle, IBoardShape)
private
FColor: integer;
procedure SetColor(const aColor: integer);
function GetColor: integer;
property Color: integer read GetColor write SetColor;
protected
{$IFNDEF AUTOREFCOUNT}
[Volatile] FRefCount: Integer;
{$ENDIF}
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;

_AddRef_ReleaseInterfacedObject 中的相同:

function TGameRectangle._AddRef: Integer;
begin
{$IFNDEF AUTOREFCOUNT}
Result := AtomicIncrement(FRefCount);
{$ELSE}
Result := __ObjAddRef;
{$ENDIF}
end;

function TGameRectangle._Release: Integer;
begin
{$IFNDEF AUTOREFCOUNT}
Result := AtomicDecrement(FRefCount);
if Result = 0 then
Destroy;
{$ELSE}
Result := __ObjRelease;
{$ENDIF}
end;

要创建一个矩形,我这样做:

var  
lRect: TGameRectangle;
begin
lRect := TGameRectangle.Create(self);
lRect.Parent := Layout1;
lRect.Align := TAlignLayout.alClient;
FIntObj := lRect as IBoardShape;

后来我通过将 FIntObj 设置为 nil 来释放它。在 Windows 上,当我遵循_Release时,引用计数为 1,并且计数递减并且对象被释放。在 Android 上运行时,当我进入 _Release 时,引用计数为 5(引用计数显示在 __ObjRelease 内)。由于引用计数仍然很高,因此对象不会释放。

我基本上只使用我在此处发布的代码在一个非常简单的演示中重新创建了它。有人可以解释一下 ARC 中的不同之处导致引用计数如此之高吗?

最佳答案

所有这些在 ARC 下都是不必要的,因为 ARC 已经计算引用并控制生命周期。

在 ARC 下,您可以而且应该依赖基类的 IInterface 实现。

在 ARC 下,您的代码应如下所示:

TGameRectangle = class(TRectangle, IBoardShape)
private
FColor: integer;
procedure SetColor(const aColor: integer);
function GetColor: integer;
property Color: integer read GetColor write SetColor;
end;
<小时/>

你更大的问题是你的代码永远无法在非 ARC 平台上运行。那是因为您拥有一个 TComponent 后代。因此,所有者持有对矩形对象的引用,并在其被销毁时尝试销毁。除此之外,您的接口(interface)引用计数也假定所有权。一般来说,对象必须有一个所有者。你的设计给了他们两个。

在非 ARC 平台上,如果对象没有所有者,您应该仅通过接口(interface)引用计数来管理生命周期。我在我的 answer 中对此进行了更详细的讨论。回答你之前的问题。

关于delphi - 使用 ARC 与不使用 ARC 释放接口(interface)对象 - Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772494/

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