1

这不是我的代码。我刚到这个网站,正在做代码审查。

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

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

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

但是,它仍然存在,因为实例的静态持有者仍然存在。这是否会保留创建它的活动(并在创建实例时通过“getInstance”调用传递到“super()”)?

它们使实例保持活动状态,因为它们随后将其用于来自其他地方的调用,并且具有需要传递的值。

我知道这段代码很臭,但我想确保它确实泄漏内存(第一个活动),然后我让他们重新编写它(或自己重新编写它——这更有可能)。

4

2 回答 2

2

是的,它可以。如果代码启动其他活动,那么是的。如果只使用过一项活动,那么很可能不会。原因是,必须使用活动上下文来实例化对话框(它会与应用程序上下文一起崩溃)。如果该活动被设置为销毁,垃圾收集将不会清理它,直到所有对它的引用都被销毁。如果这个单例对话框存在于活动之外(应该是这种情况),那么它将继续引用活动并阻止 GC 清理它。您可以在此处阅读有关泄漏上下文的更多信息:避免内存泄漏

正如您所说,代码很糟糕,并且使用这样的单例对话框是完全错误的(无论它是否泄漏)。有更好的方法来维护状态之间的数据。

于 2012-05-14T16:02:19.417 回答
0

与其在类中创建和保存,不如DialogSingleton该类中构建对话框,Singleton但将Dialog实例返回给调用者类。所以调用Activity将负责解雇Dialog,我相信不会有内存泄漏。

于 2016-10-19T07:40:09.000 回答