我有几个表格,其中我有一个填充运行时的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
,但这将使您的对象处于"僵尸"状态,并且不被视为有关对象的内存管理的"理想"解决方案。