代码之家  ›  专栏  ›  技术社区  ›  maf-soft

如何正确地释放Firemonkey控件,在本例中是一个具有父窗体的子窗体?

  •  4
  • maf-soft  · 技术社区  · 7 年前

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

    的典型用例 TFmxObject.Release 是吗?然而,它似乎只能在Windows下工作,而不能在Android下工作,而这种方法现在是 已弃用 无论如何

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

    当我使用 .Free 相反,它在Windows下仍能工作(析构函数立即发生,但处理程序在释放后不会访问控件),在Android中没有明显的问题,但析构函数从未调用过,所以我有一个漏洞。

    具有 .DisposeOf 效果与 。释放 -Windows正常,Android挂起。

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

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

    1 回复  |  直到 7 年前
        1
  •  7
  •   Dalija Prasnikar    4 年前

    TFmxObject.Release 使用 TThread.ForceQueue 在内部,这一点目前在Android下已被打破(见上文讨论)。

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

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

    重要的是要记住,您不应该保留对正在释放的控件的任何其他引用,否则您可能会遇到麻烦。

    10.4及更新版本的更新:

    自10.4和统一内存管理 DisposeOf 现在相当于 Free 在所有平台和 Self.DisposeOf 可以替换为 Self.Free