2

ArrayList に格納されているオブジェクトのリストを解放する必要があります。Delphi で Free プロシージャを呼び出せることは知っていますが、Delphi Prism には Free プロシージャがありません。リストからオブジェクトを削除するだけでなく、メモリから解放したいのです。

たとえば、次のクラスがあるとします

TheClass = Class
 private
 theStr:String;
 protected
 public
end;

method TheForm;
begin
 TheArrayList:=new ArrayList;
end;

オブジェクトを追加するには、次のようにします。

method TheForm.AddToList;
var
 tmpObj:TheClass;
begin
 tmpObj := new TheClass;
 TheArrayList.Add(tmpObj);
end;

リストからオブジェクトを削除するには、これが私が行う方法ですが、無料の手順はありません。

method TheForm.DeleteFromList;
var I:integer;
begin
 for I:=0 to theArrayList.count-1 do
 begin
  theClass(theArrayList[I]).free;     <-------I know this doesnt work.
  theArrayList.RemoveAt(I);
 end;
end;
end;

Delphi Prism でオブジェクトのリストを解放するにはどうすればよいですか?

ありがとう、

4

3 に答える 3

4

クラスは、ファイル、ウィンドウ ハンドル、データベース接続などの管理されていないリソースを保持していないため、.net ガベージ コレクターが適切なタイミングであると判断したときにメモリを解放する以外に何もする必要はありません。

ガベージ コレクターを事前に強制的に実行しようとすると、通常、単にその仕事を任せるよりもパフォーマンスが低下します。

アンマネージ リソースを含むクラスがある場合は、IDisposable パターンに従う必要があります。

于 2011-09-06T14:28:42.280 に答える
1
while theArrayList.count > 0 do
  theArrayList.RemoveAt(0);

GCがお手伝いします。

于 2011-09-06T13:53:05.570 に答える
1

Delphi Prism プログラムは .NET 上で実行されます。オブジェクトを解放する必要はありません。最終的にはガベージ コレクタが解放するからです。誰かがすでにコメントしたように、オブジェクトが実装している場合は、IDisposable.Dispose() を呼び出してメモリ以外のリソースを解放できます。

Delphi の Create-try-finally-Free-end に少し似た using 構造もあります。

using MyArrayList = new ArrayList do
begin
  // use ArrayList...
end; // IDisposable(ArrayList).Dispose is called, if applicable.

もちろん、これは配列内のアイテムには機能しません。本当に必要な場合は、それぞれで Dispose を呼び出すことができます。しかし、一般的に、これは必要ありません。

そう:

method TheForm.DeleteFromList;
begin
  theArrayList.Clear;
end;

何も解放する必要はありません。

于 2011-09-06T14:28:18.680 に答える