【问题标题】:Memory leak in Kotlin companion objects?Kotlin伴随对象中的内存泄漏?
【发布时间】:2018-08-31 13:41:42
【问题描述】:

我正在使用 Kotlin 进行 Android 开发。有趣的问题。在 Java 中,在静态字段中保存 Context 是内存泄漏。但如果我在 Kotlin 伴生对象中存储上下文,Android Studio 不会说这是内存泄漏。这意味着在 Java 字节码伴随对象不是静态代码? 例如:

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        appContext = applicationContext
    }

    companion object {
        lateinit var appContext: Context
    }
}

这里没有内存泄漏?感谢您的回答:)

【问题讨论】:

  • 如果您担心泄漏,您可以随时使用WeakReference,这将防止对象被垃圾收集,直到首先清除所有“强”引用。
  • 这不是问题。

标签: memory-leaks kotlin kotlin-companion


【解决方案1】:

您的代码实际上确实以静态方式存储了 Context,只是 lint 无法提取它并出于某种原因警告您。

但是,在这种特定情况下,您并没有真正面临造成内存泄漏的风险。您正在静态存储 Application 对象本身,这将在您的应用程序的整个生命周期中保持活动状态 - 就像静态变量一样。如果这是其他一些寿命较短的Context,你会遇到麻烦,但应用程序Context 应该没问题。

关于这样做是否安全的参考:

【讨论】:

  • 感谢您的回答!
  • “请注意,即使伴随对象的成员在其他语言中看起来像静态成员,但在运行时它们仍然是真实对象的实例成员” - 来自kotlinlang.org/docs/reference/object-declarations.html 的文档所以如果你这样做在伴随对象后面存储上下文,在底层,它是一个可垃圾回收的实例变量。
  • 嗯,是的,但是它所属的伴生对象实例静态存储的。
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多