列表(及其对象)应该如何声明为
var
myList: TList;
并创建为
myList := TObjectList.Create;
被释放?
是否应该像简单的
TList
一样在循环中单独释放对象,或者myList.Free
也会释放列表中的对象,因为它被创建为TObjectList
?
TObjectList
相对于常规 TList
的优势在于,如果 TObjectList.OwnsObjects
属性设置为 true 那么这意味着 TObjectList
维持已添加到其中的对象的生命周期。
TObjectList
文档:
使用TObjectList 来存储和维护一个对象列表。对象列表 提供属性和方法来添加、删除、重新排列、定位、 访问和排序对象。如果 OwnsObjects 属性设置为 true (默认),TObjectList 控制其对象的内存,释放 重新分配其索引时的对象;当它从 使用 Delete、Remove 或 Clear 方法列出;或者当 TObjectList 实例本身被销毁。
所以,如果你将你的
TObjectList
设置为拥有它的对象(这是它的默认行为),在它被销毁时它会自动销毁它列表中的每个对象。
如果您使用带有 Advanced Reference Counting 的 Delphi 版本,则例外,其中
TObjectList
只会减少它拥有的对象的引用计数。因此,如果这些对象也在其他地方被引用,那么在这些额外的引用也被删除之前它们不会被销毁。