воскресенье, 21 апреля 2013 г.

BeforeRelease

Для того, чтобы избежать проблемы описанной тут - http://www.gunsmoker.ru/2013/04/plugins-9.html ("Двойное освобождение интерфейсов") - вводится виртуальный метод BeforeRelease.

Вот тут:

destructor _RefCountedPrim_.Destroy;
begin
  if (InterlockedDecrement(f_RefCount) = 0) then
  begin
   Inc(f_RefCount);
   try
    try
     BeforeRelease;
     Cleanup;
    finally
     inherited Destroy;
    end;//try..finally
   finally
    Dec(f_RefCount);
   end;{try..finally}
  end;//InterlockedDecrement(f_RefCount) = 0
end;//_RefCountedPrim_.Destroy


Его перекрываем в наследниках и делаем там всю "сохраняющую работу". И ГЛАВНОЕ - в этот момент объект находится ещё в СТАБИЛЬНОМ состоянии. Со всеми ЖИВЫМИ данными.

Позже я постараюсь привести более развёрнутый пример с тестами.

А предыдущая серия была тут - http://18delphi.blogspot.com/2013/04/iunknown.html

Про AfterRelease надо видимо отдельно написать.

Комментариев нет:

Отправить комментарий