Graeme,

You are explicitly freeing MyClass. My point is that with reference counted interfaces and in the example I posted, you shouldn't have to explicitly free the delegated interface. It should be freed automatically as soon as it goes out of scope.

Tony Whyman

MWA

On 10/08/16 16:43, Graeme Geldenhuys wrote:
On 2016-08-10 13:42, Tony Whyman wrote:
In the example, TMyClass is the interface class doing the delegation and
while TDelegateClass is being destroyed when it goes out of scope,
TMyClass is not.
Maybe I'm missing something, but here is a quick example I put together.
Testing with FPC 2.6.4 under FreeBSD and classes are created and freed
as they are supposed to.

Here is the console output:

$ ./test2
Creating TMyClass
Creating TMyInterface
TMyInterface.P1
TMyInterface.P2
Destroying TMyClass
Destroying TMyInterface

And the code for the test project.

===================[ test2.pas ]=======================
program test2;

{$mode objfpc}{$H+}

{ Delegating to an interface-type property }

type
   IMyInterface = interface
     procedure P1;
     procedure P2;
   end;

   TMyInterface = class(TInterfacedObject, IMyInterface)
   private
      procedure P1;
      procedure P2;
   public
     constructor Create;
     destructor Destroy; override;
   end;

   TMyClass = class(TObject, IMyInterface)
     FMyInterface: IMyInterface;
     property MyInterface: IMyInterface read FMyInterface implements
IMyInterface;
   public
     constructor Create;
     destructor Destroy; override;
   end;


procedure TMyInterface.P1;
begin
   writeln('TMyInterface.P1');
end;

procedure TMyInterface.P2;
begin
   writeln('TMyInterface.P2');
end;

constructor TMyInterface.Create;
begin
   writeln('Creating ',ClassName);
end;

destructor TMyInterface.Destroy;
begin
   writeln('Destroying ',ClassName);
   inherited Destroy;
end;



var
   MyClass: TMyClass;
   MyInterface: IMyInterface;

{ TMyClass }

constructor TMyClass.Create;
begin
   writeln('Creating ',ClassName);
end;

destructor TMyClass.Destroy;
begin
   writeln('Destroying ',ClassName);
   inherited Destroy;
end;

begin
   MyClass := TMyClass.Create;
   MyClass.FMyInterface := TMyInterface.Create;  // some object whose
class implements IMyInterface
   MyInterface := MyClass;
   MyInterface.P1;
   MyInterface.P2;
   MyClass.Free;
end.

========================[ end ]========================

Regards,
   Graeme


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to