2017-02-15 40 views
0

我有几个窗体,我有一个TListBox组件,我填充运行时。如何在Delphi中从内存中释放运行时ListBoxItems西雅图Firemonkey多设备应用程序

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

  • 通过使用所有者?表单或列表框?
  • 还是自己释放它们?
  • 或以不同的方式?

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

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; 

我已经注意到,创建列表可能需要更长的时间,当我设置的项目的所有者。 另外当我调用ListBox.Clear和列表充满了没有所有者的项目列表仍然被正确清除。那么这是否意味着当我使用AddObject将它们添加到ListBox时,项目的所有者会被设置?

此外,我自由地与亲密动作形式:

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

我不知道这是否会改变一切如何释放在我的列表中的项目?

+0

Firemonkey使用ARC(自动引用计数)作为内存管理的一种手段。我建议你阅读[Embarcadero关于它的说明](http://docwiki.embarcadero.com/RADStudio/Seattle/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers)。 –

+0

@TomBrunberg我已阅读该页面,但我仍然不完全确定哪种方式适合我的情况。它并不真正涵盖可视化组件或列表,所以 – Remi

+1

FMX不强加ARC。下一代编译器使用ARC作为内存管理。在桌面上,FMX使用与Vcl相同的内存管理,即基于所有权的 –

回答

1

当你做一个.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; 

因为你正在做的则是家长设置为nil为ARC启用平台,从而在物体什么中解脱出来,一旦其引用计数达到0(因为没有其他引用像对象等对象)。

而在非ARC平台上,.DisposeOf只是一个免费电话。 但是,您也可以在ARC平台中使用.DisposeOf,但这会使您的对象处于“僵尸”状态,并且不被视为关于对象的内存管理的“理想”解决方案。

+0

设置一个TFmxObject父属性只是调用addObject方法,所以没有区别。 – Remi

+0

@Remi,是的,创下了家长和调用'AddObject'归结为同一个,我只是说,你也可以通过设置家长这样做,但我的回答并解决您的关于释放对象最初的问题? –

+0

为什么使用ItemByIndex?为什么不MyList.Items或MyList.ListItems?你有没有任何文件支持你的答案? – Remi

相关问题