Rol*_*son 15 delphi delphi-2007 tlist
我对用于在列表中存储对象的内容感到有点困惑.到目前为止,我已经TList
在循环中使用和释放了每个项目.然后我发现TObjectList
自动执行此操作Free
.然后我从以下文档中看到了这个TList.Clear
:
调用
Clear
清空Items数组并将其设置Count
为0.Clear
还释放用于存储Items
数组的内存并将其设置Capacity
为0.
所以它基本相同.所以
对于 TList
mylist.Clear;
myList.Free;
Run Code Online (Sandbox Code Playgroud)
是一样的TObjectList
吗?
myList.Free;
Run Code Online (Sandbox Code Playgroud)
可TObjectList
仅用于项目类或我可以存储记录?
Arn*_*hez 20
1.从TList不会释放元件,具有两个Clear
或Free
.
aList.Clear;
只是设置aList.Count := 0
而不释放aList.Items[]
元素.所以你会泄漏内存.你需要一个明确的免费版本:
for i := 0 to aList.Count-1 do
TObject(aList[i]).Free;
Run Code Online (Sandbox Code Playgroud)
但这是什么TObjectList
...... :)
关于TObjectList
,值得说的TObjectList.Destroy
就是打电话Clear
.
所以
aObjectList.Clear;
aObjectList.Free;
Run Code Online (Sandbox Code Playgroud)
与...完全相同
aObjectList.Free;
Run Code Online (Sandbox Code Playgroud)
2.要存储记录列表,可以使用动态数组.
您将TList
使用我们的动态数组包装器获得所有方法(以及更多).那就是Add / Delete / Clear / Count / IndexOf / Find
......
它具有内置的序列化功能(二进制或JSON),自动排序和比较(使用RTTI),这些功能不存在TList/TObjectList
.来自Delphi 5及更高版本.
使用更现代版本的Delphi,如果您不想使用第三方库,则可以使用泛型来处理动态数组.
Ond*_*lle 12
它不同,TList.Clear
只释放分配用于存储指针的内存,而不是它们指向的对象.为了避免内存泄漏,您需要自己释放内存 - 就像您一直在做的那样 - 或使用内存TObjectList
.
要回答第二个问题,TObjectList
不支持存储记录.TList
在这种情况下你需要使用(或其他东西).
如果您使用的是最新版本的Delphi,我建议您使用通用列表.
现在,当您使用列表中的对象时,您可能需要进行大量的转换.使用通用列表,您不必再这样做了.
例如,如果你有:
TMyObject = class(TObject);
Run Code Online (Sandbox Code Playgroud)
然后你就像这样列出:
TMyObjectList = TObjectList<TMyObject>;
Run Code Online (Sandbox Code Playgroud)
Embarcadero Wiki上有一篇文章:
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)
归档时间: |
|
查看次数: |
24164 次 |
最近记录: |