2014-10-29 23 views
3

鑑於所述類都訂閱控件的事件持有對控件的引用。如果我將控件傳遞給另一個類以進行事件處理,是否會發生內存泄漏?

背景:我在幾個窗體/用戶控件上定製了滾動面板,我決定將滾動代碼提取到名爲「ScrollLogic」的類中,以便它可以重複使用。在類的構造函數是如下:

Sub New (bntUp as Button, bntDown as Button, panelToScroll as Panel, _ 
     scrollLength As Integer) 

     Me.bntUp = bntUp   'Declaration: Private bntUp As Button  
     AddHandler Me.bntUp.Click, AddressOf UpClicked 

     'Setup code for other controls/variables here 

End Sub 

當點擊一個按鈕,就ScrollLogic通過AutoScrollPosition屬性滾動panelToScroll。如果達到滾動限制,相應的按鈕被設置爲不可見。 (或可見,如果以相反的方向滾動滾動後變爲可能)

它工作正常,但我注意到,

  1. ScorllLogic訂閱點擊順序按一下按鈕的事件工作

  2. ScrollLogic持有按鈕的引用來控制其可見性。有權訪問事件的發件人是不夠的,因爲bntUp必須設置爲可見當bntDown被點擊時

這是否會導致內存泄漏?我試圖避免重寫處理ScrollLogic對象的每個受影響的表單/用戶控件的dispose(),因爲這很醜陋。任何建議將不勝感激,謝謝

回答

4

不,這裏沒有泄漏。訂閱按鈕事件會創建一個從按鈕到類對象的引用,而不是相反。引用鏈是form => buttons =>你的對象。因此,只要用戶關閉表單或處置它,一切都有資格收集。

即使你的類持有對按鈕的引用(沒有顯而易見),那麼它仍然無關緊要,GC對循環引用沒有任何問題。

有沒有提示你存儲對類對象的引用。毫無疑問,沒有任何需要,因爲按鈕足以保持活力。很難弄明白這一點,你必須做一些像存儲在一個靜態變量中的東西。通過編寫一個測試代碼來創建/顯示/處理數千次的表單,感覺良好。

相關問題