AOwnsObjects = true 就是 objectlist释放的时候,里面的对象一并释放。
TObjectList对象的创建方法有一个参数:
constructor TObjectList.Create(AOwnsObjects: Boolean);
从字面就可理解其意义:拥有对象集与否。帮助文档:
If the OwnsObjects property is set to true (the default), TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.
这段话的意思就是TObjectList 的几个删除方法和释放方法都受参数AOwnsObjects的影响。我就常常用 TObjectList来管理对象,很方便。记得第一次用时,没看文档,用的默认参数值,重载其释放方法,结果一直报错,因为在DLL中实现,找了很久才找出缘由。
TList TObjectList的区别和使用。 1,所在的单元。 TList一直就是在Classes里 TObjectList一直就是在Contnrs里 2, TObjectList对象的创建方法有一个参数: constructor TObjectList.Create(AOwnsObjects: Boolean); 从字面就可理解其意义:拥有对象集与否。帮助文档: If the OwnsObjects property is set to true (the default), TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed. 这段话的意思就是TObjectList 的几个删除方法和释放方法都受参数AOwnsObjects的影响。 用的默认参数值,释放时ObjectList里的对象一块释放掉. TList,TObjectList 使用——资源释放 TOjectList = Class (Tlist); TOjectList继承Tlist,从名字上看就可以知道它是专门为对象列表制作的,那么他到底丰富了那些功能呢? 首先是 TObject 作为对象可以方便使用,无需指针强制。 丰富了 Notify 针对当前状态处理,比如如果是删除就将该点的引用一并清理掉; procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification); begin if (Action = lnDeleted) and OwnsObjects then TObject(Ptr).Free; inherited Notify(Ptr, Action); end; 看notify方法会发现:如果TOjectList.OwnsObjects=True时(默认的创建),释放的时候会连里面的对象一块释放掉。 TOjectList.OwnsObjects=False时,释放的时候不会释放里面的对象。 在 Tlist 中,有 Clear(),将呼叫 SetCount,SetCapacity;即删除所有。 procedure TList.Clear(); begin SetCount(0); SetCapacity(0); end; 当该对象销毁是,也会自动调用Clear() 清除所有。 destructor TList.Destroy; begin Clear(); end; 如果从 Tlist 继承也必须实现 Notify() ,方便资源释放,减少麻烦。 List和OjectList释放的区别如下例子: procedure TForm1.Button1Click(Sender: TObject); var list: TObjectList; i: Integer; btn: TButton; begin list := TObjectList.Create; for i := 0 to 6 do begin btn := TButton.Create(Self); with btn do begin Caption := Format('Btn %d', [i+1]); Parent := Self; end; list.Add(btn); end; ShowMessage('TObjectList 释放时, 会同时释放其中的对象'); list.Free; end; procedure TForm1.Button2Click(Sender: TObject); var list: TList; i: Integer; btn: TButton; begin list := TList.Create; for i := 0 to 6 do begin btn := TButton.Create(Self); with btn do begin Caption := Format('Btn %d', [i+1]); Parent := Self; end; list.Add(btn); end; ShowMessage('TList 释放后, 其中的对象并未释放'); list.Free; end; 如果用TObjectList来存储,当调用sort方法时要注意先将owerobject设置为False 总结:如果有一个对象需要用到列表,最好从 TOjectList 开始继承,对资源释放有完善的处理机制。