A idéia por trás desta unidade é fornecer um ciclo de vida semelhante aos objetos contados de referência em Delphi, como o fraco reference no .NET.
Os objetos contados de referência em Delphi têm algumas limitações quando se trata de referências circulares, onde, por exemplo, as referências TParent são filhos (via Ichild), e o TCHILD faz referências a seus pais (via Iparent). Se removermos alguma referência externa às nossas instâncias IParent e Ichild sem primeiro fazer com que a criança remova sua referência ao IPARENT, acabaríamos com objetos órfãos. Isso ocorre porque nossas instâncias de Ichild e Iparent estão mantendo referências umas às outras e, portanto, elas nunca são lançadas.
As classes que podem ser fracas referenciadas precisam descer 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;
No exemplo acima, se o objeto pai for destruído diante da criança, a fraca referência a ele no objeto infantil será marcada como nula (retornos isalivos falsos).