2012-05-14 23 views
1

这不是我的代码。我刚到达这个网站,我正在做代码审查。这个对话框会泄漏内存吗?

他们有一个类是Dialog的扩展。 它已被定义为单例。

在第一次调用时,上下文被传递给getInstance方法。 它将构造函数中将接收到的上下文传递给“超级”的类实例化。 然后保存它 - 和任何单身人士一样。

然后显示对话框。用户交互后,它开始一个新的活动,并通过“closeDialog”关闭对话框。

但是,它仍然存在,因为实例的静态持有者仍然存在。然后,这会保持创建它的活动(并且在创建实例时被传递给“getInstance”调用并传入“super()”)?

它们使实例保持活动状态,因为它们随后将其用于来自其他位置的调用,并且需要将值继承。

我知道这段代码很臭,但我想确保它在我重写它(或者自己重写它 - 更有可能)之前确实会泄漏内存(第一个活动)。

+0

请发布您正在讨论的代码,使其更清晰。 –

回答

2

是的,它可以。如果代码开始其他活动,那么是的。如果只有一个活动被使用,那么很可能不会。原因是,对话框必须通过活动上下文实例化(它将与应用程序上下文一起崩溃)。如果该活动被设置为销毁,那么垃圾收集将不会清除它,除非它的所有引用都被销毁。如果这个单独的对话框存在于活动之外(应该是这种情况),那么它将继续引用该活动并阻止GC清除它。您可以在此处详细了解泄漏上下文:Avoiding memory leaks

正如你所说的代码是坏的,并使用一个这样的单身对话是完全错误的(无论有泄漏现象)。有更好的方法来维护状态之间的数据。

0

而不是创造和保持DialogSingleton类,建立在Singleton类的对话框,而是返回Dialog实例给调用者类。所以调用Activity将负责解雇Dialog,我相信不会有内存泄漏。