Create(nil);//需要自己释放 Create(Self);//当Self释放时自动触发释放 Create(Application);//当Application释放时自动释放 Create(nil);//这种方式创建的对象要自己手工进行FREE才会回收内存,其他很多内存泄漏就是忘了手工释放内存 Create(Self);//由self对象负责释放创建的对象,只要self没有释放掉,这个对象的内存就不会被释入掉,除程序员手工进行释放,他会触发很多事件。性能不是很好 Create(Application); Create(Application.owner); //这两就是把self具体对象罢了
建立窗体:
form1:=TForm.Create(application);当应用程序关闭时form1会被释放
form1:=TForm.Create(self);当前窗体释放时form1会被释放
form1:=TForm.Create(nil); 需要自己动手释放,没人会为你代劳
实现的效果:创建窗体之前先检查该窗体是否已创建,有的话关闭并释放,然后再创建
if Assigned(F_Quality)then
begin
F_Quality.Close;
FreeAndNil(F_Quality);
end ;
F_Quality :=TF_Quality.Create(nil);
例如: My := TMy.Create(X);
其中的 X 将会成为控件 My 的 Owner 属性,
可能会不只一个控件把 X 当作 Owner.
当 X 释放时, 它会同时释放那些把它当作 Owner 的所有控件.
譬如:
btn1 := TButton.Create(Panel1);
btn2 := TButton.Create(Panel1);
btn3 := TButton.Create(Panel1);
当 Panel1.Free 时, btn1、btn2、btn3 都会同时释放.
如果 btn1 := TButton.Create(Self); {譬如 Self 是窗体}
那么窗体释放时, btn1 也会同时释放.
btn1 := TButton.Create(Application);
当程序销毁时也会同时释放 btn1.
这对单窗体程序来讲基本没有区别, 但如果是多窗体就不一样了.
如果 btn1 := TButton.Create(nil);
那么 btn1 得自己负责手动释放(btn1.Free).
你也许会问: 假如 btn1 所在的窗体都销毁了, btn1 还会存在吗?
答: 如果 Application 还在 btn1 不会消失(在 Create(nil) 的情况下).
一般情况下, 当 Application 不在了, 系统会释放它所包含的控件.
但等系统来做这件事不是个好习惯, 因为有例外(一般是在跨进程的时候), 有这样一句话:
一个对象分配的内存可能会比对象本身存在的时间长.
0 条评论
沙发空缺中,还不快抢~