Kotlin почему финализер никогда не называется? - PullRequest
0 голосов
/ 03 марта 2019

Я новичок в Kotlin и не могу понять, как работает метод finalize ().Я знаю Swift, и есть метод deinit, который вызывается при уничтожении объекта.Как я могу проверить, был ли объект уничтожен в Котлине.

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 голосов
/ 03 марта 2019

Сборка мусора не гарантированно запускается сразу, когда больше нет ссылок на объект, поэтому, вероятно, вы еще не видите, как работает метод finalize.Вы можете попытаться принудительно запустить его, вызвав System.gc(), но, в конечном счете, именно реализация GC должна выбирать, когда он запускает финализаторы, поэтому вам просто не следует полагаться на них вообще.

Сборка мусора для Android может работать по-разному по многим причинам, но, по крайней мере, в простом приложении командной строки JVM это работает так, как вы ожидаете:

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