TList和TobjectList是delphi中的两种列表,其中TObjectList继承自TList
可以看到在TObjectList中的一些方法都是继承自TList的,例如Add方法等,但是其中的Notify方法是自己实现了一下
procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if OwnsObjects then
if Action = lnDeleted then
TObject(Ptr).Free;
inherited Notify(Ptr, Action);
end;
当让TObjectList掌管生命周期时会在处理delete的时候将对象本身释放掉,所以虽然TObjectList在处理对象时可以不考虑对象的释放问题,但是一定要注意自己的使用。
TObjectList的Demo
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Contnrs;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FList: TObjectList;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormDestroy(Sender: TObject);
begin
FList.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TObjectList.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
o: TStringList;
begin
o := TStringList.Create;
o.Add('13');
FList.Add(o);
//o.Free;//野指针
end;
procedure TForm1.Button2Click(Sender: TObject);
var
oSrcList, oDestList: TObjectList;//为TList没有问题
begin
oSrcList := TObjectList.Create;
oDestList := TObjectList.Create;
oSrcList.Add(FList.Items[0]);
oDestList.Add(FList.Items[0]);
// oSrcList.Free;
// oDestList.Free; //同时存在oSrcList.Free;DestList.Free;和FList.Free; 将出现野指针
end;
end.
在Button1Click和Button2Click两个方法中要注意此时加入到TObjectList 后,对象的生命周期已经归TObjectList锁掌管,尤其Button2Click中,很容易出现重复释放的问题。
针对于这种问题,一般应该创建一个子项,然后对于创建的子项将内容转载进去,然后在释放就不会有问题了。
例如:
procedure TForm1.Button2Click(Sender: TObject);
var
oSrcList, oDestList: TObjectList;//为TList没有问题
oSrc, oDest: TStringList;
begin
oSrcList := TObjectList.Create;
oDestList := TObjectList.Create;
oSrc := TStringList.Create;
oDest := TStringList.Create;
oSrc.Assign(TPersistent(FList.Items[0]));
oDest.Assign(TPersistent(FList.Items[0]));
oSrcList.Add(oSrc);
oDestList.Add(oDest);
oSrcList.Free;
oDestList.Free;
end;
TList的使用:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FList: TList;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormDestroy(Sender: TObject);
begin
FList.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
o: TStringList;
begin
o := TStringList.Create;
o.Add('13');
FList.Add(o);
o.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
oSrcList, oDestList: TList;
begin
oSrcList := TList.Create;
oDestList := TList.Create;
oSrcList.Add(FList.Items[0]);
oDestList.Add(FList.Items[0]);
oSrcList.Free;
oDestList.Free;
end;
end.
可以看出,TList中可以对于加入的内容自由处理,但是TObjectList中需要特别注意
还要注意一点,如果用TObjectList来存储,当调用sort方法时要注意先将owerobject设置为False