why aren't descendants of TInterfacedObject garbage collected?

后端 未结 3 532
臣服心动
臣服心动 2021-01-03 05:16

i have a class based on TInterfacedObject. i add it to TTreeNode\'s Data property.

TFacilityTreeItem=class(TInterfacedObject)
private
  m_guidItem:TGUID;
           


        
相关标签:
3条回答
  • 2021-01-03 05:59

    You should declare the Field/Variable as Interface

    IFacilityTreeItem = IInterface
    end;
    
    TFacilityTreeItem=class(TInterfacedObject, IFacilityTreeItem)
    private
      m_guidItem:TGUID;
      m_SomeOtherNode:TTreeNode;
    end;
    
    var
      Item: IFacilityTreeItem; // Variable as Interface
    begin
      Item:= TFacilityTreeItem.Create;
    ...
    end;
    

    To access your fields, you should declare properties in IFacilityTreeItem Interface, with Getters and Setters.

    0 讨论(0)
  • 2021-01-03 06:06

    TInterfacedObject itself is not reference counted, only interfaces are. You can implement interfaces using TInterfacedObject which basically saves you the effort of implementing the reference counting methods yourself. Unfortunately it still will not work in your case: The compiler does not know that you are assigning interfaces to the TTreeNode.Data property since it is not declared as an interface but as a pointer. So all kinds of weird things will happen:

    MyInt := TFacilityTreeItem.Create; // ref count = 1
    // Node.Data := MyInt; // won't compile
    Node.Data := pointer(MyInt); // no interface assignment, ref count stays 1
    ...
    end; // ref count reaches 0, your object gets freed
    

    As soon as you try to access your object through the .Data property, you will get an access violation.

    So, don't bother with interfaces in this case, you could get it to work, but it will be much more effort than it is worth.

    0 讨论(0)
  • 2021-01-03 06:11

    As dummzeuch said, you can get this to work with interfaces, but it takes some more code since the Data property of a TTreeNode is a pointer. For anyone wondering how to do that, this link has an example of how to do it for TListItem (it's pretty much the same for TTreeNode). You may also find it useful to read the section about interfaces and subsequent section about reference counting on that page.

    0 讨论(0)
提交回复
热议问题