用接口关联对象的生命周期(二)

//接上次讨论

//测试代码如下

procedure TForm1.btnRaiseTestClick(Sender: TObject);
var
  lvIntf2: ITest;
  lvVIList: TVIList;
begin
  lvVIList := TVIList.Create(false); //不使用List管理接口对象生命周期
  try

    //+1
    lvVIList.Add('abc', TTestIntfObject.Create);

    //+1 +1
    lvIntf2 := (lvVIList.GetInterfaceByKey('abc') as ITest);
    lvIntf2.DoWork;
    raise Exception.Create('raise error');
  finally
    //-1
    lvVIList.Remove('abc');
    lvVIList.Free;
  end;
end;

//经过上次讨论局部的接口变量在函数执行完毕时会进行隐含如下赋值

lvIntf2:=nil;

lvTempIntf:=nil;  //lvTempIntf为假想的接口是一个IInterface类型。因为 as会产生一个临时的接口

//经过上上述代码跟踪测试即使raise后,局部接口变量仍然会得到隐含的赋值

//但是对象不会隐含执行lvVIList.Free,可能也执行了lvVIList:=nil;(无法证实,猜想),在整个应用程

//序退出的时候会执行Free,但是这样是不可控制的

posted @ 2011-04-28 10:38  D10.天地弦  阅读(201)  评论(0编辑  收藏  举报