create

[转载]Delphi Create(参数:nil、self、application)的区别

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 不在了, 系统会释放它所包含的控件.
但等系统来做这件事不是个好习惯, 因为有例外(一般是在跨进程的时候), 有这样一句话:
一个对象分配的内存可能会比对象本身存在的时间长.

分享到: