gpt4 book ai didi

android - Kotlin 从嵌套类引用外部类

转载 作者:搜寻专家 更新时间:2023-11-01 09:21:25 25 4
gpt4 key购买 nike

我有一个类 O 和一个位于 O 中的嵌套类 N

N 的函数中,我想使用 this@O 引用 Othis

但它不识别O,只有当我使用内部类时。

但是,如果我使用内部类,android-studio 会提示这可能会导致泄漏。

是否有其他方法来引用外部类或避免泄漏?

最佳答案

内存泄漏的可能性是由于内部类的每个实例都持有对外部类实例的引用。程序逻辑可能不需要该外部类实例,但它仍然可见,因此不受垃圾回收的影响。

因此,如果您知道嵌套类实例的逻辑可能不需要外部类实例的全部内容,您可以通过不使用 inner 类来确保没有内存泄漏。

如果您仍然需要外部类实例的某些部分,您可以手动将这些值传递给嵌套类实例:

class A {
val b: B = someB()
val c: C = someC()

// D uses C but does not need B, so we pass C to the constructor:
class D(private val c: C) { /* ... */ }

fun createD(): D = D(c)
}

如果你还需要嵌套类实例来观察外部类实例属性的变化(不仅仅是使用嵌套类实例构造时属性的快照),你可以手动将该属性包装到一个引用持有者中并且将该持有者传递给嵌套类构造函数:

class A {
val b: B = someB()

private val cHolder = CHolder(someC())

class CHolder(var c: C)

var c: C
get() = cHolder.c
set(value) { cHolder.c = value }

// D uses C but does not need B, so we pass C to the constructor:
class D(private val cHolder: CHolder) { /* ... */ }

fun createD(): D = D(cHolder)
}

如果此模式在您的代码中重复出现,您可能希望使用一些通用解决方案而不是 CHolder 类;这只是一个演示。

然后,如果您想引用外部类的整个实例,仍然可以选择将其传递给嵌套类构造函数。与 inner class 相比,这允许您手动控制外部实例的生命周期并在不需要时删除对它的引用:

class A {
class D(private var outer: A?) {
fun forgetOuterInstance() {
outer = null
}
}

fun createD(): D = D(this)
}

最后,如果您的嵌套类在其整个生命周期内都需要外部类实例,或者如果外部类不持有任何昂贵的资源并且您可以处理其实例可能更长的生命周期,那么可以使用内部类,请记住,只要内部类实例存在,外部类实例就会保持 Activity 状态。因此,您可能希望将一些资源移出外部类,以便以更精细的方式持有和释放它们。

关于android - Kotlin 从嵌套类引用外部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54926030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com