代码之家  ›  专栏  ›  技术社区  ›  Holgerwa

形式.释放+零

  •  11
  • Holgerwa  · 技术社区  · 17 年前

    如果在使用表单后调用Form.Release,它将释放所有相关内存,但不会将表单变量设置为nil。

    if not assigned (Form1) then
      begin
        Application.CreateForm(Tform1, Form1);
        try
          // Do something
        finally
          Form1.Release
        end;
      end;
    

    Form1 := nil;
    

    就在发布之后,因为发布过程将在被调用之后和实际释放表单之前直接返回。我无法检测Form.Release何时完成将Form var设置为nil。

    最好的方法是什么?

    5 回复  |  直到 7 年前
        1
  •  17
  •   a.delphi.developer a.delphi.developer    17 年前

      Form1 := nil;  
    

    就在呼吁释放之后。

    Release只是向表单发布一条CM_Release消息,允许表单在处理CM_Release消息之前完成其队列(事件处理程序)中的内容,这意味着通常只需免费调用。
    因此,在调用Release之后,不应该假设Form变量仍然指向有效的表单,从而将nil放入变量中。

        2
  •  11
  •   Barry Kelly    17 年前

    发布只是一个(潜在的)延迟的免费版本。调用Release之后,您应该做的第一件事是将变量置零。

        3
  •  4
  •   Jim McKeeth    17 年前

    当然,你可以称之为:

    procedure FreeOrReleaseAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      if Temp is TCustomForm then
        TCustomForm(Temp).Release
      else
        Temp.Free;
    end;
    

    应该 要安全,因为像免费一样,发布是非虚拟的。

        4
  •  2
  •   Lars Truijens    17 年前

    如前所述,如果表单想要关闭/释放自己,那么发布只是一个延迟的免费表单。除了被推迟,它和发布没有什么不同。所以在那个例子中调用Release是没有用的。打免费电话似乎更符合逻辑。您可以在调用Free或使用FreeAndNil后将其设置为nil。

    如果您仍然想使用Release,这很好。只需将变量值设置为nil即可。这样做并不会使论坛的行为有所不同。但是请记住,在这种情况下,调用Free而不是Release更有效、更确定。我倾向于只在真正需要的地方使用Release。

        5
  •  0
  •   Roddy    17 年前

    在Delphi Win32中,释放对象的适当方法是调用

    FreeAndNil(Form1)
    

    这在一次呼叫中完成两项任务。

    然而,我有一种隐秘的感觉,你的问题比我想象的要复杂得多。您是否在使用Delphi for.NET?如果是,是哪个版本?