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的区别和使用。

,所在的单元。

TList一直就是在Classes里
TObjectList一直就是在Contnrs里 , 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();
SetCapacity();
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 := to do
begin
btn := TButton.Create(Self);
with btn do begin
Caption := Format('Btn %d', [i+]);
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 := to do
begin
btn := TButton.Create(Self);
with btn do begin
Caption := Format('Btn %d', [i+]);
Parent := Self;
end;
list.Add(btn);
end;
ShowMessage('TList 释放后, 其中的对象并未释放');
list.Free;
end;
如果用TObjectList来存储,当调用sort方法时要注意先将owerobject设置为False
总结:如果有一个对象需要用到列表,最好从 TOjectList 开始继承,对资源释放有完善的处理机制。

最新文章

  1. 去除Jsp页面空白行
  2. 使用CruiseControl.Net全面实现持续集成
  3. Asp.net MVC 搭建属于自己的框架(一)
  4. perl install module as non-root user
  5. [Everyday Mathematics]20150201
  6. sqlserver compact sdf, sqlite 数据库 在net中相对路径设置方法 - 摘自网络
  7. 讨论IT选定的技术招聘企业几点
  8. easyui datagrid footer 页脚问题
  9. Android Navigation 架构组件入门教程
  10. php学习----异常处理(接上篇)
  11. 【RabbitMQ】工作模式介绍
  12. PXE网络启动无人值守自动安装 centos 全程实录
  13. Spring Boot 之订制 logo
  14. 第一次Spring总结
  15. 分类器评估方法:精确度-召回率-F度量(precision-recall-F_measures)
  16. asp.net MVC在IIS7或7.5上的发布问题
  17. Socket tips: 同意socket发送UDP Broadcast
  18. HTML5 FormData对象
  19. 二十四、DBMS_SQL
  20. Real-Time SQL Monitoring using DBMS_SQLTUNE

热门文章

  1. 解题:NOI 2014 动物园
  2. LGP4577【JSOI2018】战争
  3. Python实现类似JavaScript 的Json对象
  4. ElasticStack系列之十二 & 搜索结果研究
  5. 四大开源协议比较:BSD、Apache、GPL、LGPL
  6. P1171 售货员的难题
  7. 转:iOS-CoreLocation:无论你在哪里,我都要找到你!
  8. 超简单将Centos的yum源更换为国内的阿里云源
  9. linux服务器上没有jar命令
  10. windows10安装配置scikit-learn步骤