我想知道为什么在我调用Free
方法之后,对象不是nil
我的意思是下一堂课:
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;
我的问题是,为什么在释放对象后nil
以及如何在不使用a
的析构函数后使nil
成为a := nil
?
答案 0 :(得分:10)
<强>解释强>
变量a
只有在分配 nil
时才会变为nil
。这意味着代码中需要a := nil
,现在缺少。
Free 只是一个方法,处理Ta
类的实例。免费销毁a
指向的实例。 a
的值仍然相同,现在指向曾经是Ta
实例的内存地址。
<强>解决方案:强>
使用FreeAndNil(a)
同时销毁变量指向的对象并对变量进行nillify。
答案 1 :(得分:3)
实例方法无法修改调用该方法的实例变量。这是因为方法传递了实例变量的副本(隐式Self参数),而不是将引用传递给实例变量。