2012-03-17 3 views
0

Free 메서드를 호출 한 후 객체가 nil이 아닌 이유가 궁금합니다. 내가 예를 들어 다음 클래스를 무엇을 의미
: 객체를 해제 한 후 nil하지 않고 어떻게 a := nil를 사용하지 않고 소멸자 후 nil을 할 a을 할 이유TObject 및 NIL의 소멸자 클래스 Delphi

type Ta = class(TObject) 
public 
    i: integer; 
    destructor Destroy; override; 
end; 

destructor Ta.Destroy; 
begin 
    inherited; 
end; 

procedure Form1.Button1; 
var a: Ta; 
begin 
    a := Ta.Create;  
    a.Free; 

    if a = nil then 
    button1.Caption := 'is assigned' 
    else 
    button1.caption := 'is not assigned'; 
end; 

내 질문은?

+6

개체를 해제해도 개체가 0으로 설정되지 않습니다. FreeAndNil (a)를 사용하십시오 – kobik

+0

그리고 당신은 소멸자로 만들 수 없습니까? – user558126

+4

아니, 할 수 없습니다. – kobik

답변

10

설명 : nil을 할당하면

변수 anil 될 것이다. 즉, 코드에 a := nil이 있어야하며 현재 누락되었습니다.

무료 클래스의 인스턴스에 대해 작업하는 방법은입니다. 무료는 a이 가리키는 인스턴스를 파괴합니다. 값이a은 여전히 ​​동일하며 이제는 한 번 Ta 인스턴스 인 메모리 주소를 가리 킵니다.

솔루션 :

사용 FreeAndNil(a) 동시에되는 변수 포인트 객체를 파괴하고 변수를 nillify합니다.

3

인스턴스 메서드는 메서드가 호출 된 인스턴스 변수를 수정할 수 없습니다. 이는 참조이 인스턴스 변수에 전달되지 않고 복사본 인스턴스 변수 (암시 적 Self 매개 변수)가 전달되기 때문입니다.