2009-09-09 69 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如何工作,並看看它的源代碼。