如何正确释放Firemonkey控件,在这种情况下是父窗体的子窗体?

时间:2018-03-07 19:40:27

标签: android delphi automatic-ref-counting firemonkey

从控件本身的事件处理程序内部,我想删除并释放它。

TFmxObject.Release的典型用例,不是吗?但是,它似乎只能在Windows下运行,但不适用于Android,而且此方法现在已弃用

我知道,没有工作不是一个很好的问题描述,但目前我无法在android下调试它。在Windows下,我看到事件处理程序在.Release之后正确继续,在完成之后,我的控件析构函数中的日志消息被执行。在Android下,应用程序挂起。

当我使用.Free时,它仍可在Windows下运行(析构函数立即发生,但处理程序在免费后无法访问控件),而在Android中没有明显的问题,但是析构函数永远不会被调用,所以我有泄漏。

使用.DisposeOf效果与.Release相同 - Windows确定,Android挂起。

我也试过MyParent.RemoveComponent(MyControl),但这一切都没有帮助。

我还需要做些什么才能释放所有引用,以便ARC可以完成其工作?或者怎么回事?

1 个答案:

答案 0 :(得分:6)

TFmxObject.Release在内部使用TThread.ForceQueue,目前在Android下已经破解(请参阅上面的讨论)。

作为一种解决方法,用于从其事件处理程序释放对象的工作跨平台版本将是

procedure TForm.CloseBtnClick(Sender: TObject);
begin
  Parent := nil;
  TThread.CreateAnonymousThread(
  procedure
  begin
    TThread.Synchronize(nil,
    procedure
    begin
      Self.DisposeOf;
    end);
  end).Start;
end;

您可以在上述方法中使用Synchronize,而不是Queue

重要的是要记住,你不应该对你正在发布的控件保留任何其他参考,否则你可能会遇到麻烦。