Динамическая обработка событий - PullRequest
2 голосов
/ 13 июня 2011

Вот случайный вопрос.

У меня есть объект под названием Обезьяна и объект под названием Банан. Банан выставил событие под названием Ripens, на которое подписывается объект Monkey. Когда вызывается событие Ripens, Обезьяна вызывает свою функцию Consume (), которая, в свою очередь, уничтожает объект Banana.

Пример:

//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 уничтожаются вместе с бананом?

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

Когда обезьяна подписывается на банан, это банан, который теперь имеет ссылку на обезьяну, а обезьяна не имеет его на банан. В вашем примере, когда бананы поднялись, они теперь подлежат уборке мусора. Так что нет - обезьяна не пропускает память.

0 голосов
/ 13 июня 2011

«Утечки памяти» от событий на самом деле происходят в другом направлении.Если обезьяна выходит из области видимости, банановое событие все еще имеет ссылку на делегат события на обезьяне, поэтому обезьяна не будет собирать мусор.обработчики для каждого объекта.Таким образом, несколько подписчиков, выходящих из области видимости, будут по-прежнему иметь ссылки на них через издателя событий, в результате чего они не будут собирать мусор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...