我一直认为,销毁视觉控件是由所有者负责的,如果我nil
以所有者身份通过,我可以手动控制销毁。
考虑以下示例:
TMyForm = class (TForm)
private
FButton : TButton;
end;
...
FButton := TButton.Create(nil); // no owner!!
FButton.Parent := Self;
我希望这个按钮会产生内存泄漏,但它不会,实际上TButton
调用了析构函数。
进一步调查表明,TWinControl
析构函数包含以下代码片段:
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
看起来它正在破坏子组件(那些Parent
设置为控件本身的组件)。
我没想到父控件会破坏控件。谁能解释为什么会这样?如果我传入所有者,谁会破坏该对象?