为什么Kotlin by lazy会导致android中的内存泄漏?

时间:2018-08-07 04:15:05

标签: android memory-leaks kotlin

我这样定义一个加载对话框

private val loadingDialog: LoadingDialog by lazy { LoadingDialog() }

loadingDialogDialogFragment

当我使用leakcanary观看我的应用程序时,我发现了loadingDialog原因内存

有人可以帮我吗?

1 个答案:

答案 0 :(得分:6)

定义val委托by lazy {...}时,传递给委托的lambda会将范围捕获到其闭包中(尽管在您的情况下,它仅是外部this,可能是Activity实例)。

然后,委托实例将保留它捕获的引用,直到第一次访问val为止。然后,它调用lambda并“忘记”闭包。

但是如果您的val访问得太晚了(或永远不会访问),lambda的关闭可能会将对象保留在内存中,否则这些对象将被丢弃,这可能是内存泄漏。