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;
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、在一个过程里创建了一个对象(自己定义的),是否要释放?如何释放,点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;
--------------------------------
回答:这是肯定不行的,一个接口要有意义,必须与一个实现了它的对象相对应,否则会出大错。上面的例子可以这样理解:一个对象,含有某一个实现了的接口,对象赋值给接口,只是将其中接口定义的函数或过程(属性也是函数或过程)的集合让这个接口的变量来引用,而对象中的其他部他并没有赋过来,当你将接口反赋给对象时,会不会产生不完整的情况?这样理解就容易了。
1、局部过程创建的自定义对象一定要释放,但引用他的变量是否必须也要赋值NIL,我个人觉的不是必须的,不知道对不?2、上面说的接口的释放是“对象生它生,对象消失它消失”,但如果这样那当对象还有用,接口变量已经没用了,我想释放接口变量都不能释放了?