Delphi interface automatically reclaims memory

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


   IMyInterface = interface
    procedure Proc;
  end;

  TMyClass = class(TInterfacedObject, IMyInterface)
  public
    constructor Create;
    destructor Destroy; override;
    procedure Proc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  c: TMyClass;
begin
  c := TMyClass.Create;
  c.Proc;
  c.Free;
  ShowMessage('**********');

{将依次显示:
   TMyClass.Create
   IMyInterface.Proc
   TMyClass.Destroy
   **********
}
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  i: IMyInterface;
begin
  i := TMyClass.Create;
  i.Proc;
  ShowMessage('**********');
  //在本段程序的最后, 编译器能判断出接口不再有用, 会释放掉拥有它的类

{将依次显示:
   TMyClass.Create
   IMyInterface.Proc
   **********
   TMyClass.Destroy
}
end;


procedure TForm1.Button3Click(Sender: TObject);
var
  c: TMyClass;
  i: IMyInterface;
begin
  c := TMyClass.Create;
  i := c;
  //i := IMyInterface(c);   {也可以这样转换}
  //i := c as IMyInterface; {暂时不能使用 as, 接口拥有 GUID 后才可以使用 as 转换}
  i.Proc;
  ShowMessage('**********');

{将依次显示:
   TMyClass.Create
   IMyInterface.Proc
   **********
   TMyClass.Destroy
}
end;


procedure TForm1.Button4Click(Sender: TObject);
var
  i: IMyInterface;
begin
  i := TMyClass.Create;
  i.Proc;
  i := nil; //可以这样主动释放接口; 同时拥有它的类也会释放
  ShowMessage('**********');

{将依次显示:
   TMyClass.Create
   IMyInterface.Proc
   TMyClass.Destroy
   **********
}
end;


procedure TForm1.FormCreate(Sender: TObject);
begin

end;

{ TMyClass }


constructor TMyClass.Create;
begin
  inherited;
  ShowMessage('TMyClass.Create');
end;

destructor TMyClass.Destroy;
begin
  ShowMessage('TMyClass.Destroy');
  inherited;
end;

procedure TMyClass.Proc;
begin
  ShowMessage('IMyInterface.Proc');
end;

end.
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 300
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 200
    Top = 104
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 392
    Top = 144
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 248
    Top = 199
    Width = 75
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 408
    Top = 216
    Width = 75
    Height = 25
    Caption = 'Button4'
    TabOrder = 3
    OnClick = Button4Click
  end
end

Reposted from  https://www.cnblogs.com/del/archive/2009/06/05/1496742.html 

Guess you like

Origin blog.csdn.net/warrially/article/details/87912919