从控件本身的事件处理程序内部,我想删除并释放它。
TFmxObject.Release
的典型用例,不是吗?但是,它似乎只能在Windows下运行,但不适用于Android,而且此方法现在已弃用。
我知道,没有工作不是一个很好的问题描述,但目前我无法在android下调试它。在Windows下,我看到事件处理程序在.Release
之后正确继续,在完成之后,我的控件析构函数中的日志消息被执行。在Android下,应用程序挂起。
当我使用.Free
时,它仍可在Windows下运行(析构函数立即发生,但处理程序在免费后无法访问控件),而在Android中没有明显的问题,但是析构函数永远不会被调用,所以我有泄漏。
使用.DisposeOf
效果与.Release
相同 - Windows确定,Android挂起。
我也试过MyParent.RemoveComponent(MyControl)
,但这一切都没有帮助。
我还需要做些什么才能释放所有引用,以便ARC可以完成其工作?或者怎么回事?
答案 0 :(得分:6)
TFmxObject.Release
在内部使用TThread.ForceQueue
,目前在Android下已经破解(请参阅上面的讨论)。
作为一种解决方法,用于从其事件处理程序释放对象的工作跨平台版本将是
procedure TForm.CloseBtnClick(Sender: TObject);
begin
Parent := nil;
TThread.CreateAnonymousThread(
procedure
begin
TThread.Synchronize(nil,
procedure
begin
Self.DisposeOf;
end);
end).Start;
end;
您可以在上述方法中使用Synchronize
,而不是Queue
。
重要的是要记住,你不应该对你正在发布的控件保留任何其他参考,否则你可能会遇到麻烦。