1、在一个过程里创建了一个对象(自己定义的),是否要释放?如何释放,点FREE吗?代码示范:
procedure TfrmSayHello.btnCNClick(Sender: TObject);
begin
  sayhello(TChinese.create);//TChinese是我自己创建的对象=class(TObject);
end;2、接口变量的释放是Delphi自己管理的,但接口变量引用的对象实例呢?是否也自动管理(被释放)呢?3、实现了接口的类可以转换成接口类型,但反过来,接口类型不能转换成这个类吗?想不通啊,他们引用的实际上都是这个类的实例嘛,为什么就不能再转回来了呢???代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
    f: ifoot; //type ifoot=interface ....
    fb, xx: tfootball; //type tfootball=class(TInterfacedObject,ifoot)
begin
    fb := tfootball.Create;
    f := fb;   //类转换接口没问题
  xx := f;   //接口转换类,不行? 
end;

解决方案 »

  1.   

    建议楼主看看<<DELPHI面向对象编程思想>>
      

  2.   


    1、在一个过程里创建了一个对象(自己定义的),是否要释放?如何释放,点FREE吗?代码示范:
    procedure TfrmSayHello.btnCNClick(Sender: TObject);
    begin
      sayhello(TChinese.create);//TChinese是我自己创建的对象=class(TObject);
    end;
    ------------------------------------------
    回答:必须释放,否则就会发生内存泄漏。JAVA和C#不必自己动手释放,它们自己有垃圾回收机制(GC)。你上面的写法也不对,在进行FREE时连个引用的变量都没有,所以必须在“sayhello”之前先引用一个变量。如果你的TChinese是个有属主的类,在生成对象时属主不是NIL,那么可以不必自己动手而且一定不要自己动手FREE。2、接口变量的释放是Delphi自己管理的,但接口变量引用的对象实例呢?是否也自动管理(被释放)呢?
    ------------------------------------------
    回答:你正好搞反了,接口有计数可以自动释放,是因为它连接具体对象的缘故,对象生它生,对象消失它消失,是这种自动释放,而不是反过来。但是可以进行间接的构造,类似二级跳,让另一对象自动回收,不过有些复杂。3、实现了接口的-对象-可以转换成接口类型,但反过来,接口类型不能转换成这个-对象-吗?想不通啊,他们引用的实际上都是这个类的实例嘛,为什么就不能再转回来了呢???代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
        f: ifoot; //type ifoot=interface ....
        fb, xx: tfootball; //type tfootball=class(TInterfacedObject,ifoot)
    begin
        fb := tfootball.Create;
        f := fb;   //类转换接口没问题
      xx := f;   //接口转换类,不行? 
    end;
    --------------------------------
    回答:这是肯定不行的,一个接口要有意义,必须与一个实现了它的对象相对应,否则会出大错。上面的例子可以这样理解:一个对象,含有某一个实现了的接口,对象赋值给接口,只是将其中接口定义的函数或过程(属性也是函数或过程)的集合让这个接口的变量来引用,而对象中的其他部他并没有赋过来,当你将接口反赋给对象时,会不会产生不完整的情况?这样理解就容易了。
      

  3.   

    谢谢上面的“fjwolf(火狼)” 朋友,听了你详细的解释学到了不少,最后还有两个小问题希望帮忙解释下,谢谢。
    1、局部过程创建的自定义对象一定要释放,但引用他的变量是否必须也要赋值NIL,我个人觉的不是必须的,不知道对不?2、上面说的接口的释放是“对象生它生,对象消失它消失”,但如果这样那当对象还有用,接口变量已经没用了,我想释放接口变量都不能释放了?