我有点疑惑的是什么,以用于在列表中存储对象。 到现在为止我已经使用TList
并在循环中解脱出来的每个项目。 后来我发现TObjectList
从自动执行此Free
。 然后,我看到这个从商务部TList.Clear
:
呼叫Clear
清空项目阵列和设置Count
为0 Clear
还释放用于存储所述存储器Items
数组并设置Capacity
为0。
因此,它基本上是相同的。 所以
对于TList
mylist.Clear;
myList.Free;
是一样的TObjectList
?
myList.Free;
可以TObjectList
只能用于项目类或我可以存储记录?
1.从TList不会释放的元素,既Clear
或Free
。
aList.Clear;
将刚刚设置aList.Count := 0
而不释放所述aList.Items[]
的元素。 所以,你会泄漏内存。 你需要一个明确免费为这样的:
for i := 0 to aList.Count-1 do
TObject(aList[i]).Free;
但是,这是什么TObjectList
呢... :)
关于TObjectList
,值得一说TObjectList.Destroy
呼吁Clear
。
所以
aObjectList.Clear;
aObjectList.Free;
是完全一样的
aObjectList.Free;
2.要存储的记录列表,你可以使用一个动态数组。
你会得到所有TList
方法(和更多)与我们的动态数组封装 。 也就是说, Add / Delete / Clear / Count / IndexOf / Find
...
它具有内置的序列特征(在二进制或JSON),自动分拣和不与现有的比较(使用RTTI) TList/TObjectList
。 德尔福5及更高版本。
随着越来越多的现代版本的Delphi,你可以使用泛型来处理动态数组,如果你不希望使用第三方库。
它是不一样的TList.Clear
仅释放分配存储指针,它们都指向不是对象的内存。 为了避免内存泄漏,你需要自己释放内存-因为你一直在做的-或使用TObjectList
。
要回答第二个问题, TObjectList
不支持存储记录。 您需要使用TList
在这种情况下(或别的东西)。
读什么的文档更仔细地说:
清除还释放用于存储物品阵列的存储器
仅用于阵列本身的内存被释放,而不是由阵列内单独的元件中使用的存储器。
如果您使用的是德尔福最新版本的,我建议你使用一个通用的清单。
现在,你可能需要当你从列表中使用的对象做了很多铸造的。 随着通用的清单,你不必这样做了。
例如,如果您有:
TMyObject = class(TObject);
然后,你使列表如下:
TMyObjectList = TObjectList<TMyObject>;
有一个在英巴卡迪诺维基的文章:
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)
真的看TObjectList
代码contnrs.pas OwnObjects
什么都不做。 FOwnObjects
是私处声明的变量TObjectList
未在任何地方使用TObjectList
代码(除刚刚分配值),并没有覆盖Clear
它的过程。
所以,恐怕有必要释放内存只是一样TList
。