Android: 使用 ArrayAdapter 的强引用循环

Android: Strong reference cycle using ArrayAdapter

在我尝试为我的应用程序中的所有适配器抽象出通用功能时,我在查看困扰我的 ArrayAdapter 代码时遇到了一些问题。

据我所知,使用 ListView 的常见模式如下:

  1. 在 XML 中创建 ListView,它将在 Activity 中有一个引用。
  2. 创建一个 ArrayAdapter 并将 Activity 作为其上下文。
  3. 在 ListView 中设置 ArrayAdapter。

看一眼代码就会发现 ListView 存储了对适配器的强引用,而 ArrayAdapter 存储了对上下文的强引用,即我的 Activity。这创建了一个强大的引用循环,这让我有点困扰。

我知道这可以通过在 onDestroy 中将 ListView 引用设置为 null 来解决。但是在使用导致它的相同技术的任何教程中从未讨论过这个问题。

我的问题是我在这里遗漏了什么还是这是常识?

ARC 不是 Java/Android 使用的真正的 GC(垃圾收集器),因此它们具有不同的行为。其中一种行为是,对于 ARC,由开发人员来打破任何循环引用以防止内存泄漏,但这对 Android 来说不是问题,其 GC 可以在运行时自动检测此类引用并适当地处理这些对象。

深入了解平台的底层工作原理总是好的,这些信息可能会帮助您区分两者并对 GC 有一些了解: