Utilisation du comptage de références
Remonter à Gestion mémoire des objets interface
Dans cette documentation, vous trouverez une description du comptage des références pour les interfaces prises en charge par tous les compilateurs 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;
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.