2011-06-12 165 views
2

這是一個隨機問題。動態事件處理

我有一個叫做Monkey的對象,和一個叫做Banana的對象。香蕉揭露了Monkey對象訂閱的一個叫做Ripens的事件。當Ripens事件被觸發時,猴子調用它的Consume()函數,這反過來破壞了香蕉對象。

例子:

//And yes, I know this isnt real C# code. Just trying to get my point across and 
//not necessarily be syntatically correct with this exmaple. 
public class Banana 
{ 
    public event Ripens; 
} 

public class Monkey 
{ 
    public Monkey() 
    { 
     List<Banana> tree = new List<Banana>(); 
     for (int i = 0; i < 8; i ++) 
     { 
      tree.Add(new Banana()); 
      tree[i].Ripens += this.Consume;   
     } 
    } 

    public void Consume(Banana b) 
    { 
     tree.Remove(b); 
     b.Destroy(); 
    } 
} 

所以我的問題是,然後:請問猴子流血內存,以便在沒有從事件第一退訂摧毀每一根香蕉。或者猴子的事件處理程序與香蕉一起銷燬?

+1

http://stackoverflow.com/questions/298261/do-event-handlers-stop-garbage-collection-from-occuring的副本。答案是否定的,不管是否有訂閱,都會收集香蕉。 – Andrei 2011-06-12 23:20:14

回答

3

當猴子訂閱香蕉時,現在有一個參考猴子的香蕉,而猴子沒有香蕉。在你們舉例說香蕉上漲的時候,他們現在需要垃圾收集。所以沒有猴子不會泄漏記憶。

+0

謝謝!這就是我所想的,但有時我喜歡與其他人確認。 – 2011-06-12 23:27:28

0

來自事件的「內存泄漏」實際上發生在另一個方向上。如果猴子超出範圍,那麼香蕉事件仍然可以參考猴子上的事件代表,所以猴子不會收集垃圾。

要解決你的「每個」問題,是的 - 事件處理程序是每個對象。因此,超出範圍的多個訂閱者仍然會通過事件發佈者引用它們,導致它們不被垃圾收集。