今天盒子中有朋友遇到对象释放的问题,原文在这里,他的实现大意是建立一个TmyLayout = class(TLayout),然后在这个类中画线,Form对象调用实例化这个类来画线,然后释放掉这个对象,问题就出在释放。我们看一下他建立这个对象与释放的代码:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
     ly := TmyLayout.Create(Self);
     ly.Parent := Form1; // Self;

for I := 0 to 9 do
     begin
          ly.DrawLine(PointF(0, 0   i * 10));
     end;
end;
这里,ly他声明为全局对象。
procedure TForm1.Button2Click(Sender: TObject);
begin
     ly.Parent := Nil;
     ly.Destroy;
end;
这是他释放ly对象的代码,注意,他用了Destory方法。正是这种方法,当在android及ios下运行时,不能正常执行。
回想在xe5/6时,关于Form对象的释放,记得就用DisposeOf方法。于是做了如下的测试:

把ly.Destory改成ly.DisposeOf,循环建立与释放对象ly10000次,内存占用正常,改成FreeAndNil(ly),内存占用不正常,达到900多MB,这说明,FreeAndNil不能正确释放内存。

好了,现在结论:用fmx做跨平台应用,用DisposeOf来释放对象。

实际上,XE7的时候就写过关于DisposeOf的文字,你可以去看看.

http://blog.sina.com.cn/s/blog_44fa172f0102vyw9.html

05-11 17:04