2011-09-06 5 views
2

ArrayList에 저장된 객체의 목록을 비워야합니다. 델파이에서 무료 프로 시저를 호출 할 수 있지만 델파이 프리즘에서는 무료 프로 시저가 없다는 것을 알고 있습니다. 나는 단지 목록에서 객체를 제거하고 싶지만 그 객체를 메모리에서 제거하고 싶지 않다. 예를 들어 Delphi Prism에서 객체의 arraylist를 해제하는 방법은 무엇입니까?

내가 이런 짓을 했을까

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에서 개체 목록을 확보 할 수 있습니까?

감사합니다,

+0

가비지 수집기가있는 .net입니다. 기억을 놓을시기를 결정하게하십시오. –

+0

@ David, Okay. 그러나 가비지 컬렉터를 기다리지 않고 객체를 강제로 해제해야하는 상황이 발생하면 어떻게 될까요? – ThN

답변

4

클래스가 파일, 창 핸들, 데이터베이스 연결 등과 같은 관리되지 않는 리소스를 보유하고 있지 않기 때문에 .net 가비지 수집기가 시간이 맞다고 결정할 때 메모리를 비우는 것 외에는 아무 것도하지 않아도됩니다.

가비지 수집기를 강제 실행하려고하면 일반적으로 단순히 가비지 컬렉터를 실행하는 것보다 성능이 저하됩니다.

관리되지 않는 리소스가있는 클래스가있는 경우 follow the IDisposable pattern이어야합니다.

1
while theArrayList.count > 0 do 
    theArrayList.RemoveAt(0); 

GC가 당신을 도울 것입니다.

+1

ArrayList.Clear는 어떻습니까? –

+0

ArrayList.Clear? +1 – TheHorse

1

.NET에서 Delphi Prism 프로그램이 실행됩니다. 쓰레기 수거자가 결국 그렇게 할 것이므로 어떤 물건도 자유롭게 할 필요가 없습니다. 누군가 이미 주석 처리 했으므로 IDisposable.Dispose()를 호출하여 메모리가 아닌 다른 리소스를 해제 할 수 있습니다 (객체가 구현 한 경우). 또한이

등 약간 인 구성하여 델파이 시도 - 마지막-무료 엔드 - 만들기 :

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

이 물론 배열의 항목에 대해 작동하지 않습니다. 정말로 원한다면, 각각에 대해 Dispose를 부를 수 있습니다. 그러나 일반적으로 이것은 필요하지 않습니다.

그래서 :

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

아무것도 확보 할 필요가 없습니다.

+0

@ David : 편집 해 주셔서 감사합니다. –

관련 문제