2011-06-12 2 views
2

여기에 임의의 질문이 있습니다.동적 이벤트 처리

나는 Monkey라는 객체와 Banana라는 객체를 가지고 있습니다. 바나나 (Banana)는 원숭이 (Monkey) 개체가 구독하는 Ripens라는 이벤트를 노출했습니다. Ripens 이벤트가 발생하면 원숭이가 Consum() 함수를 호출하여 바나나 객체를 파괴합니다.

예 :

//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(); 
    } 
} 

그래서 내 질문에 다음입니다 : 원숭이가 먼저 이벤트에서 탈퇴하지 않고 파괴 될 때마다 바나나 메모리를 피 않습니다. 아니면 Monkey의 이벤트 핸들러가 바나나와 함께 파괴 될까요?

+1

중복의 http://stackoverflow.com/questions/298261/do-event-handlers-stop-garbage-collection-from-occuring. 그리고 대답은 부정입니다. 바나나는 구독 여부와 관계없이 수집됩니다. – Andrei

답변

3

원숭이가 바나나에 가입하면 원숭이에 대한 참조가있는 바나나이며 원숭이에게는 바나나가 없습니다. 귀하의 사례에서 바나나가 증가했을 때 그들은 이제 가비지 수집의 대상이됩니다. 따라서 원숭이는 기억을 누설하지 않습니다.

+0

감사! 그게 내가 생각한 것,하지만 때로는 다른 사람들과 확인하는 것을 좋아합니다. –

0

이벤트의 "메모리 누출"은 실제로 다른 방향으로 발생합니다. 원숭이가 범위를 벗어나면 바나나 이벤트는 여전히 원숭이의 이벤트 대리자에 대한 참조를 가지므로 원숭이는 가비지 수집을하지 않습니다.

"각"질문을 해결하려면 예 - 이벤트 처리기가 개체별로 있습니다. 따라서 범위를 벗어나는 여러 구독자는 이벤트 게시자를 통해 참조가 생겨 가비지 수집 대상이되지 않습니다.