Delphi Android内存泄漏(或其他速度减慢)



我正在打开一个新表单。每次打开时都会变慢。我尝试了FormClose事件FreeAndnil、Free、Release、DisposeOf,但没有尝试解决方案。我添加了一个备用计时器:

按钮1第一次点击,表格2显示0,18秒后

按钮1第二次点击,表格2显示0.2秒后

按钮1第三次点击,在表格2显示0,23秒之后

按钮第四次单击,在窗体2显示0,28秒之后。。.

按钮1 xxxx点击,表格2显示6.30秒后

//Form1 Button1 Click 
Application.CreateForm(TFrom2,Form2);
Form2.Show;

//Form2 OnCLose
//i try 
//FreeAndNil, Free, Relsease,DisposeOf ...

如何解决这个问题?示例项目来源:https://www.dropbox.com/s/yeqpizr6rfo6254/LeakProblem.rar

尝试20-30次点击"Form2显示按钮"请参阅备忘录中的增加等待时间。

好吧,我把你的项目搞砸了一点,让它发挥了作用,但你做的很多事情与我通常的编程方式不同。

对于初学者来说,在移动设备中处理表单时,您要使用.DisposeOf,而不是FreeAndNil。请参阅此链接,特别是:

在某些情况下,您需要正确执行析构函数代码离开,不管事实上可能还有其他悬而未决的对对象的引用。[…]新编译器引入了一个dispose模式:MyObject.DisposeOf

我注意到的另一件事是您的第三单元创建Form4。但是第四单元访问第三单元的备忘录。我希望这只是为了演示的目的,因为我不认为这种设计是建议的。

因此,简要总结一下我是如何让它工作的:我在Form4中设置了一个TNotifyEvent,用于它完成时:

procedure TForm4.Button1Click(Sender: TObject);
begin
if assigned(FOnCloseEvent) then
FOnCloseEvent(Self);
end;

在Uni3中,我在创建表单时设置了一个处理程序:

MyForm.OnCloseEvent := CloseEvent;

事件触发此代码:

procedure TForm3.CloseEvent(Sender: TObject);
begin
if assigned(MyForm) then
MyForm.DisposeOf;
end;

我还将MyForm作为TForm3的私有对象,而不是局部变量。

有了这些变化,我可以随心所欲地表演和结束,而且形式总是会很快展现出来。如果有更好的方法,请告诉我!

相关内容

最新更新