VSoft.WeakReferences
v0.1.5
該單元背後的想法是提供類似的生命週期來與Delphi中的參考對像一樣,就像弱referference在.NET中一樣。
在循環引用方面,Delphi中的參考計數對像有一些局限性,例如tparent引用其兒童(通過iChild),而tchild引用它的父母(通過iParent)。如果我們刪除了對iParent和Ichild實例的任何外部引用,而沒有先讓孩子刪除對iParent的引用,我們最終將得到孤兒的對象。這是因為我們的Ichild和Iparent實例互相參考,因此它們永遠不會被釋放。
可能被引用的類別需要從TWeakReferencedObject下降。
type
TParent = class(TWeakReferencedObject, IParent)
...
end;
TChild = class(TInterfacedObject, IChild)
private
FParent : IWeakReference<IParent>;
protected
procedure SetParent(const parent : IParent);
function GetParent : IParent;
public
property Parent : IParent read GetParent write SetParent;
end;
implementation
procedure TChild.SetParent(const parent : IParent);
begin
if parent <> nil then
FParent := TWeakReference<IParent>.Create(parent)
else
FParent := nil;
end;
function TChild.GetParent : IParent;
begin
result := nil
if (FParent <> nil) and FParent.IsAlive then
result := FParent.Data;
end;
在上面的示例中,如果父對像在孩子之前被銷毀,則在子對像中對其對象的弱參考將被標記為零(因此,歸還返回false)。