delphi中的接口都继承自Iinterface,这是一个与Iunknown一样的接口,这意味着我们的对象都必须实现Iunknown中的那3个方法,更进一步的我们为了不用手工书写这些代码我们的类都继承自默认实现了Iinterface的类TinterfacedObject。然而错误的根源就在这个地方,继承自TinterfacedObject的对象根本不允许我们手工管理它的生命周期,因为Iunknown的实现类会根据对象中的引用计数来维护对象的生命周期,而上面的tempfoo是一个过程的局部变量,当它离开作用域时会被delphi编译器自动调用tempfoo._ Release(这是Iunknown的方法),这个方法在引用计数为0的时候将自动释放对象!而我们在调用TFooManager.CreateAFoo方法时其中仅做了一次as操作result:=FList[FooNum-1] as IFoo;(delphi会在这时自动增加一个对象的引用计数),所以引用计数为1在_ Release后变为0,于是在我们想访问我们创建的对象之前这个对象就已经不存在了。好了,问题的起因弄的很清楚了,要解决也不难,我们只用在返回请求接口之前进行一次_AddRef操作增加引用计数值,这样除非我们手工释放对象,否则引用计数都不会为0,如下的改进:
function TFooManager.CreateAFoo: IFoo;
begin
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!