オブジェクトをリストに格納するために何を使用するかについて少し戸惑っています。これまで、TList
を使用して、ループ内の各アイテムを解放してきました。次に、TObjectList
からこれを自動的に行うFree
を発見しました。それから私はこれをTList.Clear
のドキュメントから見ました:
Clear
を呼び出してItems配列を空にし、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
.。
TList/TObjectList
には存在しない、組み込みのシリアル化機能(バイナリまたはJSON)、自動ソートおよび比較(RTTIを使用)があります。 Delphi5以降から。
最新バージョンのDelphiでは、サードパーティのライブラリを使用したくない場合は、genericsを使用して動的配列を処理できます。
それは同じではありませんTList.Clear
ポインタを格納するために割り当てられたメモリのみを解放し、ポインタが指しているオブジェクトは解放しません。メモリリークを回避するには、これまでと同じように自分でメモリを解放するか、TObjectList
を使用する必要があります。
2番目の質問に答えるために、TObjectList
はレコードの保存をサポートしていません。その場合は、TList
(または他の何か)を使用する必要があります。
最新バージョンのDelphiを使用している場合は、汎用リストを使用することをお勧めします。
今のところ、リストのオブジェクトを使用するときは、おそらく多くのキャストを行う必要があります。一般的なリストを使用すると、もうそれを行う必要はありません。
たとえば、次の場合:
TMyObject = class(TObject);
次に、次のようなリストを作成します。
TMyObjectList = TObjectList<TMyObject>;
EmbarcaderoWikiに次の記事があります。
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)
ドキュメントが言っていることをもっと注意深く読んでください:
Clearも解放しますItems配列を格納するために使用されるメモリ
配列自体のメモリのみが解放され、配列内の個々の要素によって使用されるメモリは解放されません。