Как избавиться от обработчиков событий безопасно?

Вы, вероятно, не указали путь к заголовкам mysql, который можно найти в / usr / include / mysql, на некоторых системах Unix, я думаю. См. этот пост , это может быть полезно.

Кстати, связанный с вопросом того парня выше, о синтетической конфигурации. Можно добавить следующее в ваш ~ / .vimrc:

let b:syntastic_c_cflags = '-I/usr/include/mysql'

, и вы всегда можете проверить вики-страницу разработчиков на github. Наслаждайтесь!

7
задан pbean 5 June 2009 в 11:41
поделиться

4 ответа

так: A - издатель, а B подписчик?

первый пункт: если B является экземпляром с AEventHandler - тогда он все еще используется, поэтому нет, он не будет собираются, если только экземпляр a недоступен.

второй пункт: а? (прочитаю еще раз ... ) Если оба экземпляра A и B недоступны, они будут удалены сборщиком мусора; событие не имеет значения. Если A доступен, то B останется активным. Однако подписка на событие никогда никогда не поддерживает A в действии; это один путь ... A может поддерживать B в живых, но B не поддерживает A . Это покрывает это?

третий пункт: в большинстве случаев у этих двух вещей одинаковая продолжительность жизни, так что это не проблема. Это становится проблемой только в том случае, если объект, публикующий событие, живет намного дольше, чем объекты с обработчиками. В этом случае вам просто нужно неукоснительно убирать за собой - например: aX - = AEventHandler . В частности,

8
ответ дан 6 December 2019 в 14:09
поделиться
  1. Верно.
  2. Верно.
  3. Почему вы хотите обойти это поведение? Так устроен сборщик мусора. Если вам нужно выполнить некоторую очистку после разрушения каждого объекта, используйте шаблон Dispose.
2
ответ дан 6 December 2019 в 14:09
поделиться

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

public void UnbindEvent(A a)
{
    a.X -= AEventHandler;
}

Я также хотел бы спросить, почему вы устанавливаете переменные класса равными нулю?

4
ответ дан 6 December 2019 в 14:09
поделиться

Да, события являются ссылками, если вы не отмените регистрацию, объект, реализующий обработчик событий, не будет собираться мусором.

Вы можете сделать это:

Удалить все зарегистрированные события , если A знает, когда они больше не используются.

class A
{
  // clearing all registrations
  private void ClearEvents()
  {
    X = null;
  }
}

Или вы отменяете регистрацию в B, если B знает, когда они больше не используются. Вам нужно сохранить ссылку на a, чтобы иметь возможность отменить регистрацию.

Вы также можете реализовать IDisposable.

class B : IDisposable
{
  private A registeredToA;

  public void BindEvent(A a)
  {
    registeredToA = a;
    registeredToA.X += AEventHandler;
  }

  public void Dispose()
  {
    registeredToA.x -= AEventHandler;
  } 
}

Это критическое изменение вашего кода, потому что B всегда нужно удалять.

1
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: