Kotlin мусора собирать сильные ссылки лямбда - PullRequest
0 голосов
/ 11 октября 2018

MainActivity.kt:

class MainActivity : AppCompatActivity() {

    private val printers = Printers()

    private val strongObject = object: Item {
        override fun print(): Int {
            return Log.e("MainActivity", "strongObject")
        }
    }

    private val strongSAM = {
        Log.e("MainActivity", "strongSAM")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val localObject = object: Item {
            override fun print(): Int {
                return Log.e("MainActivity", "localObject")
            }
        }
        val localSAM = {
            Log.e("MainActivity", "localSAM")
        }
        printers.add(strongObject)
        printers.add(strongSAM)
        printers.add(localObject)
        printers.add(localSAM)
        findViewById<TextView>(R.id.content).setOnClickListener {
            printers.dump()
        }
    }

}

Item.java:

public interface Item {
    int print();
}

Printers.java:

public class Printers {
    List<WeakReference<Item>> list = new ArrayList<>();

    public void add(final Item item) {
        list.add(new WeakReference<>(item));
    }

    public void dump() {
        Log.e("Printers", "Size: " + list.size());
        for (final WeakReference<Item> item: list) {
            if (item.get() != null) {
                item.get().print();
            }
        }
    }
}

Вывод:

Size: 4
strongObject

Если вы запустите эту программу, вы заметите, что сборщик мусора будет собирать мусор strongSAM, localSAM и localObject.Однако у strongSAM есть сильная ссылка, как можно собирать мусор?

Я пытался использовать dex2jar и Luyten для просмотра сгенерированного файла класса: enter image description here

Изпросмотрщик классов в сгенерированном классе strongSAM действительно является полем и имеет сильную ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...