Comment libérer un objet d'interface (Delphi 7)

Dans une partie de mon application, j'ai la situation où je reçois une interface qui je sais être un objet, mais je ne sais pas exactement de la classe. J'ai pour stocker un objet dans une interface de type variable.

Finalement, je pourrais recevoir d'une autre instance de ce type, et la première doit être jeté et remplacé par le nouveau. Pour cela, j'ai besoin de libérer de la mémoire qui la reliait objet utilise (mon interface fournit un AsObject méthode si je peux utiliser le TObject méthodes). Mon problème est que quand je veux attribuer "nil" à cette variable de nouveau, je reçois une violation d'accès.

J'ai écrit un petit programme qui reproduit ma situation. Je poste ici afin de clarifier la situation.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

type
   ISomeInterface = interface
      function SomeFunction : String;
      function AsObject : TObject;
   end;

   TSomeClass = class(TComponent, ISomeInterface)
   public
      called : Integer;
      function SomeFunction : String;
      function AsObject : TObject;
   end;

var
   SomeInterface : ISomeInterface;
   i : Integer;

function TSomeClass.SomeFunction : String;
begin
   Result := 'SomeFunction called!';
end;

function TSomeClass.AsObject : TObject;
begin
   Result := Self;
end;

begin
   try
      SomeInterface := nil;

      for i := 1 to 10 do
      begin

         if SomeInterface <> nil then
         begin
            SomeInterface.AsObject.Free;
            SomeInterface := nil;          // <-- Access Violation occurs here
         end;

         SomeInterface := TSomeClass.Create(nil);
         SomeInterface.SomeFunction;       // <-- if commented, Access 
                                           //     Violation does not occur

      end;

   except on e : Exception do
      WriteLn(e.Message);
   end;

end.

La question est donc: comment puis-je libérer cet objet correctement?

source d'informationauteur Pablo Venturino