Delphi的Interface的使用(语法与语义)(100分)

  • 主题发起人 主题发起人 ntchenms
  • 开始时间 开始时间
N

ntchenms

Unregistered / Unconfirmed
GUEST, unregistred user!
Interface(关键字)可以用来声明一个类的接口,在Delphi中是为COM引入的,可是我在使
用中发现,如下的代码有时可能会出现内存泄漏,不知应如何避免,请教各位大虾了。
示例:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
ITest=interface
[GUID] //可选
function test:Boolean;
end;
TTestMemo=class(TMemo,ITest)
public
function test:Boolean;
end;
implementation
function TTestMemo.test:Boolean;
begin
result:=true;
end;

//---------------如此使用-------
//Ex1
procedure Ex1;
var
Memo1:TTestMemo;
IT:ITest;
begin
Memo1:=TTestMemo.create; //New
IT:=Memo1; //Cast
IT.test;
Memo1.free;
end;

//Ex2
procedure Ex2;
var
// Memo1:TTestMemo;
IT:ITest;
begin
IT:=TTestMemo.create; //New and cast 这里可能存在着问题
IT.test;
end;

//Ex3
procedure Ex3;
var
Memo1:TTestMemo;
IT:ITest;
begin
Memo1:=TTestMemo.create; //New
IT:=Memo1 as IT; //Cast,need GUID
IT.test;
Memo1.free;
end;

类似的,我想主要是有关Delphi在处理对象转型至Interface时是否会自动处理引用计数,
并在引用计数为零时是否会调用对象的析构函数的问题。不知哪位大虾可以将的很清楚,
并能给出各通用的解决办法。

先谢了
 
Delphi的每个接口都是从IUnknown继承下来的,所以每个实现这些接口的类都必须
实现IUnknown的三个方法:QueryInterface()、_AddRef()和_Release()。
QueryInterface()函数用于查询一个对象是否支持一个给定接口,如果支持,就返回
指向该接口的指针。
_AddRef()用于将对接口的引用的引用计数加1。
_Release()用于将对接口的引用的引用计数减1,当引用计数减少到0的时候,就
从内存中释放自己。
当给一个接口类型的变量赋值时,编译器会自动调用接口的_AddRef()方法,从而使
该对象的引用计数加1。当接口变量超出了它的作用域或被赋值为nil时,编译器会自动
调用接口的_Release()方法。

 
后退
顶部