La idea detrás de esta unidad es proporcionar un ciclo de vida similar a los objetos contados con referencia en Delphi como lo hace WeakReference en .NET.
Los objetos contados con referencia en Delphi tienen algunas limitaciones cuando se trata de referencias circulares, donde, por ejemplo, las referencias tparentes son niños (a través de ICHILD), y las referencias de Tchild son padres (a través de IPARENT). Si eliminamos alguna referencia externa a nuestras instancias IPARENT e ICHILD sin que el niño primero elimine su referencia a iParent, terminaríamos con objetos huérfanos. Esto se debe a que nuestras instancias Ichild e Iparent están teniendo referencias entre sí y, por lo tanto, nunca se liberan.
Las clases que pueden ser referenciadas débiles deben descender de 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;
En el ejemplo anterior, si el objeto principal se destruye antes del niño, la referencia débil en el objeto infantil se marcará como nulo (por lo tanto, la isaliva regresa falso).