2011-06-12 98 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

来自事件的“内存泄漏”实际上发生在另一个方向上。如果猴子超出范围,那么香蕉事件仍然可以参考猴子上的事件代表,所以猴子不会收集垃圾。

要解决你的“每个”问题,是的 - 事件处理程序是每个对象。因此,超出范围的多个订阅者仍然会通过事件发布者引用它们,导致它们不被垃圾收集。