这不是我的代码。我刚刚到达这个网站并正在进行代码审查。
他们有一个类,它是Dialog的扩展。 它被定义为单身。
在第一次调用时,将上下文传递给getInstance方法。 它实例化将接收的上下文传递给构造函数中的“super”的类。 然后它保存它 - 与任何单身一样。
然后显示对话框。用户交互后,它会启动一个新活动并通过“closeDialog”关闭对话框。
然而,它仍然存在,因为实例的静态持有者仍然存在。 这会继续保持创建它的活动(并在创建实例时传递给“getInstance”调用并传入“super()”)?
它们使实例保持活动状态,因为它们然后将它用于来自其他地方的调用,并且具有需要继承的值。
我知道这段代码很臭但我想确保它在我重新编写它之前确实泄漏了内存(第一个活动)(或者我自己重写它 - 这更有可能)。
答案 0 :(得分:2)
是的,它可以。如果代码启动其他活动,那么是。如果只使用过一个活动,那么很可能不会。原因是,对话框必须使用活动上下文进行实例化(它将与应用程序上下文一起崩溃)。如果将该活动设置为销毁,则垃圾收集将不会清除它,直到销毁所有对它的引用。如果此单例对话框位于活动之外(应该是这种情况),那么它将继续引用该活动并阻止GC清除它。您可以在此处阅读有关泄漏上下文的更多信息:Avoiding memory leaks
正如你所说的那样,代码很糟糕,使用像这样的单例对话框是完全错误的(无论是否泄漏)。有更好的方法可以在状态之间维护数据。
答案 1 :(得分:0)
不是在Dialog
类中创建和保持Singleton
,而是在Singleton
类中构建对话框,但将Dialog
实例返回给调用者类。所以调用Activity
将负责解雇Dialog
,我相信不会有内存泄漏。