释放Android中动态创建的控件

释放Android中动态创建的控件,android,delphi,firemonkey,Android,Delphi,Firemonkey,在我的Firemonkey多平台应用程序中,我动态创建了一些控件。使用后,我会销毁它们 在Windows中,此动态创建和销毁的进程没有问题。然而,在Android中,下面的代码似乎没有破坏控件,因为会弹出一个错误,说明控件已经存在(当我尝试重新创建控件时,我确实看到旧控件仍然存在) 我如何确保Android(和/或iOS)中的控件被正确销毁?我想iOS也是如此 在RAD Studio 10.4之前,Delphi在iOS和Android平台上使用对象生命周期管理。在ARC下,TObject.Fre

在我的Firemonkey多平台应用程序中,我动态创建了一些控件。使用后,我会销毁它们

在Windows中,此动态创建和销毁的进程没有问题。然而,在Android中,下面的代码似乎没有破坏控件,因为会弹出一个错误,说明控件已经存在(当我尝试重新创建控件时,我确实看到旧控件仍然存在)

我如何确保Android(和/或iOS)中的控件被正确销毁?我想iOS也是如此


在RAD Studio 10.4之前,Delphi在iOS和Android平台上使用对象生命周期管理。在ARC下,
TObject.Free()
FreeAndNil()
的行为不符合您的预期。编译器将它们转换为纯粹的
nil
赋值,从而减少对象的引用计数。对象的引用计数下降到0后才会释放

在您的示例中,所讨论的对象有多个引用(在
Controls[]
列表中和
oControl
变量中),因此
FreeAndNil()
没有达到预期效果,因为它只是将
oControl
变量设置为nil,而没有从
控件[]中删除对象
list。换句话说,您的示例实际上与以下内容相同:

对于i:=oParentRect.controlScont-1向下到0 do
开始

oControl:=oParentRect.Controls[i];//您在这里使用的是哪个版本的Delphi?我认为您应该使用
oControl.dispeof
。我假设您使用的是10.4以下的Delphi,重复的问题适用于此。由于10.4iOS和安卓不再有ARC编译器,处理和免费工作方式相同。感谢回复和回答。抱歉,我忘了提到我使用的是Delphi10.3。我很快就会切换到10.4。谢谢你的回复。嗨,雷米,非常感谢你的详细回复。这一点非常清楚。现在我知道我错在哪里了。祝您有个美好的一天!
for i := oParentRect.ControlsCount-1 downto 0 do
begin
  oControl := oParentRect.Controls[i];
  if (oControl is TText)
     or (oControl is TEdit)
     then
     begin           
       FreeAndNil( oControl );
       // I have also tried oControl.Free;
     end;
end;