Situations où il ne faut pas utiliser le comptage de références

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion mémoire des objets interface


Si votre objet est un composant ou un contrôle détenu par un autre composant, votre objet utilise alors un autre système de gestion mémoire ayant son origine dans TComponent. Bien que certaines classes combinent les approches de gestion de la durée de vie de TComponent et le comptage de référence d'interface, cela est très compliqué à implémenter correctement.

Pour créer un composant qui prend en charge les interfaces en outrepassant le mécanisme de comptage de références de l'interface, vous devez implémenter les méthodes _AddRef et _Release dans le code comme suit :

function TMyObject._AddRef: Integer;
begin
  Result := -1;
end;
function TMyObject._Release: Integer;
begin
  Result := -1;
end;

Vous devez quand même implémenter normalement QueryInterface afin de permettre l'interrogation dynamique de votre objet.

Comme vous implémentez QueryInterface, vous pouvez toujours utiliser l'opérateur as pour des interfaces dans la mesure où vous créez un identificateur d'interface (IID). Vous pouvez également utiliser l'agrégation. Si l'objet externe est un composant, l'objet interne implémente le comptage de références comme d'habitude, en déléguant au "controlling Unknown". C'est au niveau de l'objet externe que la décision est prise de circonvenir les méthodes _AddRef et _Release et de prendre en charge la gestion de la mémoire par une autre approche. En fait, vous pouvez utiliser TInterfacedObject comme classe de base pour l'objet interne d'une agrégation ayant comme objet externe contenant un objet qui ne suit pas le modèle de durée de vie de l'interface.

Remarque :  Le "controlling Unknown" est l'interface IUnknown implémentée par l'objet externe et pour laquelle le comptage de références de l'objet entier est tenu à jour. IUnknown est identique à IInterface, mais est utilisée à la place dans les applications basées sur COM (Windows seulement). Pour plus d'informations sur les diverses implémentations de IUnknown ou de IInterface par les objets internes ou externes, voir Agrégation et les rubriques d'aide en ligne de Microsoft sur le "controlling Unknown".

Voir aussi