2009-06-30 42 views
2

當我有一個對象時,刪除對它的所有引用足以爲垃圾收集器註冊它,至少這是我所聽到的。例如:刪除對象的所有引用將刪除該對象內的事件偵聽器?

removeChild(object); 
object = null; 

雖然我仍然有點困惑,因爲這是否意味着這個對象的實例內的事件偵聽器也會自動刪除?還是有什麼我需要做的?

回答

7

啊,你已經打的託管代碼中的內存管理問題:如果你是一個對象,並且你有一個對另一個對象的引用(即使它只是一個事件監聽器的形式),那麼你至少有一個原因,該對象不會是在GC期間從內存中移除。

對於顯示對象,並在我的經驗,幾乎任何時候你想訂閱的事件調度但負責該調度程序的剩餘內存,你應該用弱引用選項添加事件偵聽器:

myPublisher.addEventListener("myEvent", myHandlerFunction, false, 0, true); 

在幾乎所有情況下,我遇到的這些日子,「假,0,真正的」(其中true表示「使用弱引用,」和鬆散翻譯爲「添加此監聽器,但不讓它調度員不從內存中清除的原因「 - 查看文檔以獲取更多信息)是添加e的正確方法發泄聽衆。很少有教科書或文檔片段出於某種原因說明了這種方法,這是不幸的,因爲它使得更直觀的內存管理體驗成爲可能。我建議使用它作爲規則而不是例外。

希望它有幫助!

+1

+1 - 但你應該更清楚地聲明是的,註冊一個事件監聽器將保持該對象不被GC註冊,直到它被註銷,除非你註冊爲弱監聽器,在這種情況下它不會。 – fenomas 2009-06-30 18:38:26

0

你應該考慮的一個重要的事情是,如果一個對象O有事件處理程序,即作爲事件處理程序添加到E的方法,那麼這也算作參考...除非你添加處理程序與弱引用...

此外,如果你有一個封閉,其外部範圍包含至O參考,那麼這是一個參考...

您不必刪除所有引用O,簽署它爲GC無論是。 GC還會刪除循環引用......它會刪除內存中的所有「孤島」,如果您將......只連接內置對象的「大陸」(即定時器,顯示列表,I/O)的「peninsulae」圖層等不收集...

another post of mine交易的最後一段與這個主題有點...

所以是的,基本上,如果O與其GCD,那麼任何事件處理程序得到GCD,除非有另一個引用他們...等。

希望幫助.. :)

格爾茨

back2dos

+0

請注意,雖然我不是在談論這個對象的事件,我正在談論一個事件監聽器_inside_這個對象。 – Tom 2009-06-30 19:46:37

相關問題