为什么kotlin懒惰会导致android中的内存泄漏?

Wer*_*erb 6 android memory-leaks kotlin

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

private val loadingDialog: LoadingDialog by lazy { LoadingDialog() }
Run Code Online (Sandbox Code Playgroud)

loadingDialog 是一个 DialogFragment

当我leakcanary用来观看我的应用程序时,我找到了loadingDialog原因记忆

有人能帮助我吗?

hot*_*key 7

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

然后委托实例保存它捕获的引用,直到val第一次访问它为止.然后它调用lambda并'忘记'闭包.

但是如果val访问得太晚(或从不),lambda的闭包可能会将对象保留在内存中,否则会被丢弃,这可能是内存泄漏.

  • 是的!为了使其工作,您必须小心哪个对象持有委托属性,并将其限制为生命周期与 lambda 中使用的资源同步的对象。我所说的“同步”是指这些对象的寿命不应长于任何引用的资源,例如问题中的“Activity”。 (2认同)