Как освободить интерфейсный объект (Delphi 7)

В какой-то части моего приложения, У меня есть ситуация, когда я получаю интерфейс, который, как я знаю, является объектом, хотя я не знаю точного класса. Я должен сохранить этот объект в переменной типа интерфейса.

В конце концов, я могу получить другой экземпляр этого типа, и первый должен быть отброшен и заменен новым. Для этого мне нужно освободить память, которую использует интерфейсный объект (мой интерфейс предоставляет метод AsObject, поэтому я могу использовать на нем методы TObject). Моя проблема в том, что когда я снова хочу присвоить этой переменной «nil», я получаю нарушение прав доступа.

Я написал небольшую программу, которая воспроизводит мою ситуацию. Я размещаю его здесь, чтобы прояснить ситуацию.

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.

Итак, вопрос: как я могу правильно освободить этот объект?

14
задан RRUZ 27 January 2011 в 20:53
поделиться