不稳定和闪退优先排查变量的创建和释放,访问等相关代码,这里只是说明一下在传统VCL转到FMX后经常碰到问题时的大概率原因。
在VCL开发中经常使用destroy来释放创建的类示例(Create和Destroy或Free一一对应),
而Delphi FMX在开发Android APP时,经常出现APP崩溃闪退也有很大可能性是因Destroy导致的。
因为在FMX,全局变量和类变量采用引用计数来释放,而计数的增加很多时候是隐藏在代码背后自动添加的,属于FMX框架运行时所需的计数量。
而在开发中在需要调用DisposeOf来减少次数即可。
若直接调用Destroy,则会导致类示例的Destroy方法被执行,也就相当于“内容”被擦除了,但引用计数仍在,所以在FMX框架内部在引用计数为0时的自动释放中,会再次擦除不存在的“内容”,相当于访问不存在的非法内存,就会导致崩溃,且调试中无法定义代码位置,若没有该经验,最终觉得毫无头绪。。。
就像上面说的,全局变量或类变量会有引用计数的影响,而且需要注意的是,匿名函数在编译时也会被当作匿名类处理,其局部变量也会转换为类变量。
当我们编译匿名函数时,若有未使用变量的警告,提示内容一般是:
[DCC Hint] Unit1.pas(56): H2164 Variable 'aSSS' is declared but never used in '(null).[0]'
这里的 (null).[0] 就是编译器自动创建的匿名函数类名称。