Я всегда думал, что владелец несет ответственность за уничтожение визуальных элементов управления и что я могу вручную управлять уничтожением, если я передам 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
установлен для самого элемента управления).
Я не ожидал, что родительский элемент управления разрушит элемент управления,Кто-нибудь может объяснить, почему это происходит?И кто уничтожает объект, если я передаю его владельцу?