zoukankan      html  css  js  c++  java
  • delphi AOwner自动释放-测试

    继 《Delphi 中的自动释放策略》拓展

    TComponent分枝也引入了所有权的概念,该概念取自组件库。有两个属性支持所有权:Owner和 Components。每个组件都含有一个Owner属性指定其所有者。

    一个组件可能会拥有另外的组件,在这种情况下,所有被包含组件都会出现在该组件的Components属性中。

    每个组件的构造器都会包含一个参数指定新组件的所有者。如果该引入的所有者存在,那么这个组件就会自动被添加到所有者的Components属性中。

    Components属性除了用来存储所包含组件列表外,还可以提供自动释放其所有的组件。一旦一个组件有了一个所有者,那么当其所有者被释放是,它也会自动释放。

    例如:

         因为TForm继承自TComponent,所以当一个窗体被销毁时,其所包含的所有组件都会被自动销毁并且释放其所占用的内存(当然,每个组件必须正确地设计其析构器使其能够被自动的清除)。

    constructor TComponent.Create(AOwner: TComponent);
    begin
      FComponentStyle := [csInheritable];
      if AOwner <> nil then AOwner.InsertComponent(Self);//将自己插入到所属者的所属列表中,方便所属者destroy时把自己释放
    end;
    
    destructor TComponent.Destroy;
    begin
      Destroying;
      RemoveFreeNotifications;
      DestroyComponents; //释放
      if FOwner <> nil then FOwner.RemoveComponent(Self);
      FObservers.Free;
      inherited Destro
    end;
    procedure TComponent.DestroyComponents;
    var
      Instance: TComponent;
    begin
      FreeAndNil(FSortedComponents);
      while FComponents <> nil do //循环释放自己下面所有的Tcomponent
      begin
        Instance := FComponents.Last;
        if (csFreeNotification in Instance.FComponentState)
          or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then
          RemoveComponent(Instance)
        else
          Remove(Instance);
        Instance.Destroy;
      end;
    end;

    其实核心代码就  AOwner.InsertComponent(Self) 这句。举例:

    TMyClassA=class(TButton)
      public
        procedure KKK(); virtual;
      end;
      TMyClassB=class(TMyClassA)
      public
        procedure KKK();override;
      end;
      TMyClassC=class(TMyClassB)
      public
        procedure KKK(); override;
      end
      
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        A:=TMyClassA.Create(nil);
        B:=TMyClassB.Create(nil);
        C:=TMyClassC.Create(nil);
        B.InsertComponent(TComponent(A));  //释放B时会连带释放A;以为A已经放到了B里面去管理了
    end;
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    ATS(App Transport Security)对HTTP协议屏蔽引起的问题
    后台子线程(非主线程)更新UI引起的警告
    Xcode无法启动ios模拟器的问题
    UIButton修改文字大小问题
    imageNamed和imageWithContentsOfFile-无法加载图片的问题
    storyboard在ios模拟器无法显示的问题
    返回一个数组的连续子数组和的最大值
    第二周学习进度总结
    软件工程开学第一节课课堂测试
    第一周学习进度总结
  • 原文地址:https://www.cnblogs.com/jijm123/p/14336709.html
Copyright © 2011-2022 走看看