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

时间:2014-02-19 12:09:02

标签: android delphi memory-leaks firemonkey delphi-xe5

我打开一张新表格。每次打开它时都会变慢。我尝试使用FormClose事件FreeAndnil,Free,Release,DisposeOf但不是解决方案。我添加了一个待机计时器:

Button1首先点击,表格2后显示0,18秒

Button1第二次单击,表单2后显示0,20秒

Button1第三次点击,表格2后显示0,23秒

Button1第四次点击,表格2后显示0,28秒 。 。

Button1 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显示按钮" 请参阅备忘录中的增加等待时间。

1 个答案:

答案 0 :(得分:1)

好吧,我把你的项目搞砸了一点并让它运转起来,但是你做的很多事情与我正常编程的方式不同。

对于初学者来说,在移动设备中处理表单时,您要使用.DisposeOf,而不是FreeAndNil。请参阅this link,尤其是:

  

有些情况需要正确执行析构函数代码   离开,不管可能有其他待处理的事实   对象的引用。 [...]新编译器引入了一个dispose   模式:MyObject.DisposeOf;

我注意到的另一件事是你的Unit3创建了Form4。但是你有Unit4访问Unit3中的备忘录。我希望这只是为了演示目的,因为我不认为这种设计是建议的。

所以,简要介绍一下我如何使用它:我在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的私有对象,而不是局部变量。

通过这些更改,我可以根据需要点击显示和关闭,表单将始终快速显示。如果让我知道的话,可以有更好的方法来做到这一点!