自由物体场由Rtti

时间:2016-07-24 19:10:49

标签: delphi delphi-xe4

如何在delphi(XE4)中通过Rtti释放我的对象的字段?

我需要动态释放所有字段

我可以找到字段,但我现在不知道如何释放它们:

destructor TKnBase.Destroy;
var
  AContext: TRttiContext;
  AField: TRttiField;
begin
  for AField in AContext.GetType(Self.ClassInfo).GetFields do
  begin
     -->free filed (AField)
  end;

  inherited;
end;

我尝试使用此功能但不起作用:

destructor TKnBase.Destroy;
type
  dp = ^TObject;
var
  AContext: TRttiContext;
  AField: TRttiField;
  p: dp;
begin
  for AField in AContext.GetType(Self.ClassInfo).GetFields do
  begin
    p := dp(NativeInt(AField) + AField.Offset);
    TObject(p^).Free;
  end;

  inherited;
end;

1 个答案:

答案 0 :(得分:3)

偏移量是相对于实例指针的。你的代码应该是:

 p := dp(NativeInt(Self) + AField.Offset);

您可能更喜欢使用字段对象的GetValue方法来读取字段的值。所以避免所有指针算术。

你在这里做的是非常有限的。所有派生类都被迫适合此策略。所有字段必须是对象,并且必须由此类拥有。您不能有整数字段,布尔字段等。至少你应该只尝试销毁作为对象的字段。

我的直觉告诉我,你所尝试的将被证明是行不通的。

相关问题