警告:Delphi 接口引用对象时的陷阱

原创 2006年05月17日 11:38:00

用接口来接管对象引用,以此来操作该对象,这种做法很常见,也很实用。

但是,在由于Delphi智能的接口机制,可能会让该操作隐含陷阱

首先,让我们简单看一下Delphi的接口机制:

一般,我们写的接口都继承自IInterface,实现接口的类也继承自TInterfacedObject,因为它们都替我们实现了

function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;

到这,问题就来了

以上两个接口生命周期相关的函数是上述接口和类自动替我们实现的

当将一个接口设置为NIL时,它所引用的对象也会被释放掉(的确让人恐怖)(Delphi调用_Release)

所以,当接口引用一个对象且这个对象的生命周期不确定时,这个自动的机制就留下了一个不大不小的隐患。

那到这你是不是想到了,不去手动将接口设为nil?嗯,听我接着说:

delphi的IInterface接口的生命周期是自管理的,因此,当这个接口不再被使用时,Delphi会认为你忘记把这个地址引用置为nil了,所以你会自动给你加上,那么历史又重现了。

那么怎么样避免这个陷阱呢?

我们不能直接将接口设为nil,为了绕开Delphi的自动管理机制,我们需要先将接口转换成指针,然后将它设为nil,这就避免了Delphi认为这个接口不再被使用,自动将其设为nil。

Pointer(IMyInterface) := nil;

【Delphi】接口类型中的陷阱

function abc(A: Integer): Integer; 这是一个Delphi的函数声明,看上去很简单,只有一个参数而已,但是真实情况呢?在编译成二进制代码后,实际上函数的参数已经有3个了...
  • aqtata
  • aqtata
  • 2014年02月11日 16:08
  • 1634

Delphi对象模型和接口指针分析

  • 2006年01月13日 09:51
  • 54KB
  • 下载

Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题。

网上有篇文章《Delphi接口编程的两大陷阱》,里面提到接口的生存期管理的问题。但该文章里面提到的两个问题,其实都是对 Delphi 不理解导致的。   先说该篇文章中提到的第一个问题...

Delphi 与 VC 共享接口和对象

我经常会用 Delphi 写一些工具和应用,为了扩展方便,大部分都会做成插件形式。 迫于某些原因,我的插件不得不用其他开发工具来完成,比如 VC。 于是有个大问题需要解决:如何让 D 和 VC 互...

Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题

这篇是 2011 年写的。现在 delphi 在 Android, Linux  下面增加了对象的生命周期自动化的管理,但具体如何,我还没仔细测试过。 网上有篇文章《Delphi接口编程的两大陷...

Delphi面向对象学习随笔六:接口

====================================================== 注:本文源代码点此下载 =============================...

GCD:嵌套dispatch_async时__block对象的一个内存陷阱

啥也不说,先上代码:     dispatch_async(whatever_queue, ^{         NSNumber* number = nil;         nu...

JAVA里面方法调用时传对象参数的陷阱

http://java.chinaitlab.com/base/779066.html 类似的问题,又被人问到了几次,决定还是简单总结一下吧。这个问题,一些老手已经很清楚了,但有时也会很不小...

Delphi引用C对象文件

C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:警告:Delphi 接口引用对象时的陷阱
举报原因:
原因补充:

(最多只允许输入30个字)