【问题标题】:Delphi, find Object owner [closed]Delphi,找到对象所有者
【发布时间】:2019-08-23 20:29:09
【问题描述】:

在下面的示例代码中,有什么方法可以知道 S 是否已添加到 MyStuff 中? (除了 {whatever} 或 MyStuff.Contains() 的明显结果)

Type TMyClass = Class
  a: string;
End;

    MyStuff: TObjectList<TMyClass>;

Var S: TMyClass;
begin
  MyStuff := TObjectList<TMyClass>.Create(True);
  S := TMyClass.Create;
  if {whatever} then MyStuff.Add(S);

  // who is the owner of s?

【问题讨论】:

  • 在代码 sn-p 的标题和注释中,您似乎在询问是否可以找到包含对对象的引用的实例。这就是为什么您有一个解决该问题的答案,但接受了一个完全不相关的答案。
  • 你正在寻找一个布尔变量!

标签: delphi


【解决方案1】:

不直接,不。您必须明确添加一个字段来跟踪这一点。单个对象可能可能是许多不同列表的一部分。从技术上讲,甚至是“拥有”其对象的多个列表(尽管会产生不良行为)。

我有一个习惯,总是为这样的目的添加一个字段。比如……

type 
  TMyList = class;
  TMyClass = class;

  TMyList = TObjectList<TMyClass>;

  TMyClass = class(TObject)
  private
    FOwner: TMyList;
  public
    constructor Create(AOwner: TMyList);
  end;

constructor TMyClass.Create(AOwner: TMyList);
begin
  FOwner:= AOwner;
end;

作为旁注,“所有者”一词通常用于存在非常严格的所有者关系的情况。例如,在创建组件时,您为它提供了一个“所有者”,当所有者本身被销毁时,它又负责销毁它。

【讨论】:

    【解决方案2】:

    对象生命周期/所有权管理是一门值得许多有关该主题的书籍的艺术。并且有很多(有时是相互冲突的)方法。

    但要了解您的具体情况,由于您的 TMyClass 没有 Owner 字段,我会选择的方法如下所示:

    Var S, vRef: TMyClass;
    begin
      MyStuff := nil;
      S := TMyClass.Create;
      try
        vRef := S;
        MyStuff := TObjectList<TMyClass>.Create(True);
        if {whatever} then
        begin
          MyStuff.Add(S);
          S := nil; //You could also use a TRUE-initialized boolean variable and set it to False here to indicate that the object doesn't need to be freed...
        end;
        //vRef only usefull if you still need a reference to the object after this point.
      finally
        S.Free;
        MyStuff.Free;
      end;      
    

    我相信 ARC 术语,这类似于使 S 成为强引用,而 vRef 成为弱引用。

    您的问题可能有更好的解决方案,但在有限的背景下,这就是我想出的。

    【讨论】:

    • 我很困惑,这与问题有什么关系,为什么会被接受?
    • @JerryDodge 因为问题措辞不当。这不是关于所有者,而是如果不添加到列表中,可以应用什么样的逻辑来释放对象。似乎这是关于程序流程而不是所有权的更多问题,而且从头到尾都非常不清楚。
    • 没错,这是我的意图而不是所有者,但更像是“它有所有者吗”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多