Для того, чтобы избежать проблемы описанной тут - 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 надо видимо отдельно написать.
Комментариев нет:
Отправить комментарий