Delphi 的接口自动回收内存

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

转自 https://www.cnblogs.com/del/archive/2009/06/05/1496742.html 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值