Kotlin为什么永不结局?

时间:2019-03-03 12:14:13

标签: android kotlin finalizer

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

1 个答案:

答案 0 :(得分:3)

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

Android垃圾回收可能由于多种原因而有所不同,但是至少在一个简单的JVM命令行应用程序中,它可以按您期望的那样工作:

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