列表(及其对象)应该如何声明为
var myList: TList;
创建为
myList := TObjectList.Create;
被释放?应该在一个循环中分别释放对象,就像在一个简单的TList中一样,还是myList.Free也释放列表中的对象,因为它是作为TObjectList创建的?
TList
myList.Free
TObjectList
tcomlyy61#
TObjectList相对于常规TList的优势在于,如果TObjectList.OwnsObjects属性设置为true,则意味着TObjectList将维护已添加到它的对象的生存期。引用TObjectList文档:使用TObjectList存储和维护对象列表。TObjectList提供属性和方法来添加、删除、重新排列、定位、访问和排序对象。如果OwnsObjects属性设置为true(默认值),则TObjectList控制其对象的内存,在重新分配其索引时释放对象;当使用Delete、Remove或Clear方法将其从列表中删除时;或者当TObjectList示例本身被销毁时。因此,如果您将TObjectList设置为拥有其对象(这是其默认行为),则在析构时,它将自动销毁其列表中的每个对象。例外情况是,如果您使用的是 Delphi 版本,其中对象1具有高级引用计数。TObjectList只会减少它所拥有的对象的引用计数。因此,如果这样的对象也在其他地方被引用,它们将不会被销毁,直到这些额外的引用也被删除。1:对象ARC仅用于iOS和Android平台。它最初是在 Delphi XE 4中引入的,但后来在Delphi 10.4 Sydney中删除,统一了所有平台上的传统对象内存管理模型。
TObjectList.OwnsObjects
1条答案
按热度按时间tcomlyy61#
TObjectList
相对于常规TList
的优势在于,如果TObjectList.OwnsObjects
属性设置为true,则意味着TObjectList
将维护已添加到它的对象的生存期。引用
TObjectList
文档:使用TObjectList存储和维护对象列表。TObjectList提供属性和方法来添加、删除、重新排列、定位、访问和排序对象。如果OwnsObjects属性设置为true(默认值),则TObjectList控制其对象的内存,在重新分配其索引时释放对象;当使用Delete、Remove或Clear方法将其从列表中删除时;或者当TObjectList示例本身被销毁时。
因此,如果您将
TObjectList
设置为拥有其对象(这是其默认行为),则在析构时,它将自动销毁其列表中的每个对象。例外情况是,如果您使用的是 Delphi 版本,其中对象1具有高级引用计数。
TObjectList
只会减少它所拥有的对象的引用计数。因此,如果这样的对象也在其他地方被引用,它们将不会被销毁,直到这些额外的引用也被删除。1:对象ARC仅用于iOS和Android平台。它最初是在 Delphi XE 4中引入的,但后来在Delphi 10.4 Sydney中删除,统一了所有平台上的传统对象内存管理模型。