【问题标题】:Delphi Android Memory Leak(or another slowdown)Delphi Android 内存泄漏(或其他减速)
【发布时间】:2014-02-19 12:09:02
【问题描述】:

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

Button1第一次点击,Form 2后显示0,18秒

Button1 秒点击,Form 2 后显示 0,20 秒

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

Button1第四次点击,Form 2后显示0,28秒 . . .

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

【问题讨论】:

  • 是什么让您认为这种减速是由于内存泄漏?
  • 没有任何代码和证据,我认为您对“泄漏”的看法是正确的。您通过Application.CreateForm(..) 创建的表单不会被释放,因为Application 仍然持有对它的引用。如果你不使用Application.CreateForm(..) 而是使用myForm := TForm2.Create(Nil) 怎么办?
  • Allication.CreateForm 是我的习惯。我现在试试 TForm2.Create(nil)
  • Andy_D 内存泄漏或其他。我不知道
  • @Günther the Beautiful 我尝试但不更改等待时间。

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


【解决方案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 的私有对象,而不是局部变量。

通过这些更改,我可以根据需要点击显示和关闭,并且表单将始终快速显示。如果有更好的方法,请告诉我!

【讨论】:

  • 感谢您的样品。但我不会在我的申请中应用你的建议。请分享我的示例源代码?谢谢。
  • 请与我分享一个 multilpe 表单示例,我为我的客户安装了我的应用程序,我的处境非常困难。谢谢大家
  • 好吧,如果您不想使用我给出的建议,只需尝试使用您要释放的类的 .DisposeOf outside 来释放表单。我认为您的代码的主要问题是试图从对象本身内部释放表单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多