如何从Delphi Seattle Firemonkey Multi Device应用程序中的内存中免费运行运行时lis



我有几个表格,其中我有一个填充运行时的tlistbox组件。

我的问题是我如何最好地释放我添加运行时的项目?

  • 使用所有者?表单或列表框?
  • 还是自己释放他们?
  • 或其他方式?

下面的一个示例我如何填写我的列表框:

procedure TForm1.LoadList;
var
  item: TListBoxItem;
begin
  myList.Clear;
  myList.BeginUpdate;
  try
    with myQuery do
    begin
      First;
      while not eof do
      begin
        item := TListBoxItem.Create(nil);
        try
          item.Tag := FieldByName(myIDField).AsInteger;
          item.Text := FieldByName(myDescriptionField).AsString;
          myList.AddObject(item);
        finally
          Next;
        end;
      end;
    end;
  finally
    myList.EndUpdate;
  end;
end;

我确实注意到,当我设置项目所有者时,创建列表可能需要更长的时间。同样,当i Call ListBox.clear和列表中充满了没有所有者的项目时,列表仍然可以正确清除。因此,这是否意味着当我使用AddoBject将其添加到列表框时,项目的所有者会设置?

我也以近距离动作释放表格:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.CaFree;
end;

我不知道这是否会改变我列表中的项目的内容?

进行.AddObject时,您只是给该对象为父。

我的建议是像现在这样创建对象,只给他们父母。您也可以做:

而不是做.AddObject
item.parent := mylist

,如前所述,ARC在移动平台上使用,但在桌面上,它仍然像往常一样用于使用对象。

要释放您的物品(无论平台如何),您可以这样做:

var
  I: Integer;
begin
    for I := Mylist.Count-1 downto 0 do
    begin
       {$IFNDEF AUTOREFCOUNT}
         Mylist.ItemByIndex(I).DisposeOf
       {$ELSE}
         Mylist.ItemByIndex(I).parent := nil;
       {$ENDIF}
    end;
end;

因为您正在做的事情是将父送到启用ARC平台的nil,因此一旦其参考计数达到0,就会释放该对象(鉴于没有其他引用对象,例如所有者等)。<<<<<<<<<<<<<</p>

和在非ARC平台上.DisposeOf将仅是免费的呼叫。但是,您也可以在ARC平台中使用.DisposeOf,但这将使您的对象处于"僵尸"状态,并且不被视为有关对象的内存管理的"理想"解决方案。

最新更新