我这样定义一个加载对话框
private val loadingDialog: LoadingDialog by lazy { LoadingDialog() }
loadingDialog
是DialogFragment
当我使用leakcanary
观看我的应用程序时,我发现了loadingDialog
原因内存
有人可以帮我吗?
答案 0 :(得分:6)
定义val
委托by lazy {...}
时,传递给委托的lambda会将范围捕获到其闭包中(尽管在您的情况下,它仅是外部this
,可能是Activity
实例)。
然后,委托实例将保留它捕获的引用,直到第一次访问val
为止。然后,它调用lambda并“忘记”闭包。
但是如果您的val
访问得太晚了(或永远不会访问),lambda的关闭可能会将对象保留在内存中,否则这些对象将被丢弃,这可能是内存泄漏。