Utilisation du comptage de références

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion mémoire des objets interface


Remarque : Cette rubrique décrit le comptage des références pour les interfaces, qui est supporté par tous les compilateurs Delphi. Par ailleurs, les compilateurs mobiles Delphi supportent le comptage automatique des références pour les classes. Pour de plus amples informations, voir Comptage automatique des références dans les compilateurs mobiles Delphi.

Le compilateur Delphi vous fournit l'essentiel de la gestion mémoire IInterface grâce à son implémentation de l'interrogation et du comptage de références de l'interface. Par conséquent, si vous utilisez un objet qui vit et meurt via ses interfaces, vous pouvez aisément vous servir du comptage de références en dérivant de TInterfacedObject. Si vous choisissez d'utiliser le comptage de références, vous devez faire attention à ne manipuler l'objet que sous la forme d'une référence d'interface et à être cohérent dans votre comptage de références. Par exemple :

procedure beep(x: ITest);
function test_func()
var
  y: ITest;
begin
  y := TTest.Create; // because y is of type ITest, the reference count is one
  beep(y); // the act of calling the beep function increments the reference count
  // and then decrements it when it returns
  y.something; // object is still here with a reference count of one
end;

C'est la manière la plus claire et la plus prudente de gérer la mémoire et, si vous utilisez TInterfacedObject, elle est mise en oeuvre automatiquement. Si vous ne respectez pas ces règles, votre objet peut disparaître inopinément, comme illustré dans le code suivant :

function test_func()
var
  x: TTest;
begin
  x := TTest.Create; // no count on the object yet
  beep(x as ITest); // count is incremented by the act of calling beep
  // and decremented when it returns
  x.something; // surprise, the object is gone
end;

Remarque : Dans les exemples précédents, la procédure beep, telle qu'elle est déclarée, incrémente le compteur de références (appel de _AddRef) sur le paramètre. Par contre, les déclarations suivantes ne le font pas :

procedure beep(const x: ITest);

ou

procedure beep(var x: ITest);

Ces déclarations génèrent un code plus concis et plus rapide.

Vous ne pouvez pas utiliser le comptage de références dans un cas : si votre objet est un composant ou un contrôle contenu dans un autre composant. Dans un tel cas, vous pouvez toujours utiliser les interfaces, mais sans utiliser le comptage de références car la durée de vie de l'objet n'est pas régie par ses interfaces.

Voir aussi