L'idée derrière cette unité consiste à fournir un cycle de vie similaire pour référence à des objets comptés dans Delphi comme le fait FaibleReference dans .NET.
Les objets comptés de référence à Delphi ont certaines limites en ce qui concerne les références circulaires, où par exemple les références tarents, ses enfants (via Ichild), et Tchild font référence à son parent (via iparent). Si nous supprimons des références externes à nos instances iparentes et iChild sans d'abord d'amener l'enfant à supprimer sa référence à iparent, nous nous retrouvions avec des objets orphelins. C'est parce que nos instances Ichild et iparentes se sont références les unes aux autres, et donc elles ne sont jamais libérées.
Les classes qui peuvent être faibles référencées doivent descendre 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;
Dans l'exemple ci-dessus, si l'objet parent est détruit devant l'enfant, la faible référence à celui-ci dans l'objet enfant sera marquée comme nul (donc .Salive revient false).