2009-09-09 28 views
0

假设我有一个事件监听器函数,该函数正在监听一个事件,该事件将在程序的整个生命周期中再次调用从不。聆听对象将永远不需要垃圾收集。未清除的事件侦听器消耗多少资源?

它使用多少内存?
如果它可以忽略不计,我宁愿不删除聆听者,因为使用removeEventListener()语句会使我的代码不易读。

+0

那么你的代码与这个监听器将永远不会再用于任何其他代码?对我来说,风险在于有人可能会复制这段代码,但是没有意识到removeEventListener从来没有被调用,所以内存泄漏。 – 2009-09-09 04:09:45

回答

0

这完全取决于听众的大小和复杂程度。在许多情况下,内存影响可以忽略不计,但是,您在内存中保存的对象可能会将其他几个对象保留在内存中。如果其中之一是流媒体视频或其他内容,它可能会吸引你的内存,处理器和网络。

当您第一次添加事件侦听器时,您还可以将useWeakReferences设置为true。这使得监听器和事件分派器之间的链接变弱,以至于后者在其他地方被删除时,后者不会在内存中保留先前的内容。 More on that here.

尽管如此,将对象留在内存中并不会再被使用,并且没有理由避免使用removeEventListener()。在使其正确工作之前努力争取代码可读性从来就不是一个好主意。如果您对代码的外观感兴趣,请将removeEventListener()调用放在名为cleanupUnusedListeners()的方法中。事实上,我会说忽略它是不太可读的,因为当你在寻找内存泄漏的源头时,很难找到你没有放置的地方removeEventListener()。这可能不太好,但就是这样,杰克。

+0

我同意Mims。调用addEventListener的对象越多,或者它引用的对象越多,未删除的引用将保留的内存就越多。 – 2011-07-23 17:12:30

0

这是微不足道的,除非你有成千上万。看看EventDispatcher如何工作,并看看它的源代码。