Die Idee hinter dieser Einheit besteht darin, einen ähnlichen Lebenszyklus zu liefern wie in Delphi zählte Objekte wie in .NET.
Referenz gezählte Objekte in Delphi haben einige Einschränkungen, wenn es um kreisförmige Referenzen geht, wobei beispielsweise TPARENT -Referenzen ihre Kinder (über iChild) und Tchild Referenzen sein Elternteil (über iParent) sind. Wenn wir externe Verweise auf unsere IParent- und Ichild -Instanzen entfernen, ohne das Kind zuerst zu IParent zu entfernen, würden wir am Ende verwaiste Objekte haben. Dies liegt daran, dass unsere ICHILD- und IPARENT -Instanzen Verweise aufeinander halten und daher nie freigesetzt werden.
Klassen, die schwach referenziert werden können, müssen von TWeakReferencedObject herabsteigen.
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;
Wenn das übergeordnete Objekt im obigen Beispiel vor dem Kind zerstört wird, wird der schwache Hinweis darauf im untergeordneten Objekt als NIL gekennzeichnet (so. Isalive gibt falsch zurück).