Kotlin 为什么从未调用过终结器?

Kotlin why is finalizaer never called?

我是 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")
    }
}

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

Android 垃圾收集的行为可能因多种原因而有所不同,但至少在简单的 JVM 命令行应用程序中,这会按您的预期工作:

fun main() {
    var tc: TestClass? = TestClass() // test
    tc = null
    System.gc() // TestClass freed
}