Kotlin为什么终结者从未被召唤?

问题描述 投票:0回答:1

我是Kotlin的新手,我无法理解finalize()方法的工作原理。我知道Swift,并且有一个名为deinit的方法,当一个对象被销毁时被调用。如何检查Kotlin中的对象是否已被销毁。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        printTC()
    }

    fun printTC(){
        var tc:TestClass? = TestClass()
        println(tc?.i)
        tc = null
    }

}

class TestClass{

    var i = 0

    init {
        test()
    }

    protected fun finalize(){
        println("TestClass freed")
    }

    fun test(){
        println("test")
    }
}
android kotlin finalizer
1个回答
3
投票

当没有更多对象的引用时,不保证垃圾收集立即运行,这可能就是为什么你还没有看到finalize方法运行的原因。您可以尝试通过调用System.gc()来强制它运行,但最终由GC实现来选择何时运行终结器,因此您通常不应该依赖它们。

由于许多原因,Android垃圾收集可能会有不同的行为,但至少在一个简单的JVM命令行应用程序中,这可以按照您的预期运行:

fun main() {
    var tc: TestClass? = TestClass() // test
    tc = null
    System.gc() // TestClass freed
}
© www.soinside.com 2019 - 2024. All rights reserved.