delphi中TObjectList和TList

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值