Недавно я наткнулся на проблему, вызванную каким-то очень старым кодом, который я написал, который явно предполагал, что ссылки на интерфейсы, используемые в операторе with
, будут освобождены, как только останется with
-блок - вроде как неявный try-finally
-блок (аналогично using
-состоянию C #, если я правильно понял).
По-видимому (в Delphi 2009) это не так (уже не так). Кто-нибудь знает, когда это произошло? Или мой код был просто неправильным для начала?
Чтобы пояснить, вот упрощенный пример:
type
IMyIntf = interface;
TSomeObject = class(TInterfacedObject, IMyIntf)
protected
constructor Create; override; // creates some sort of context
destructor Destroy; override; // cleans up the context created in Create
public
class function GetMyIntf: IMyIntf; //a factory method, calling the constructor
end;
procedure TestIt;
begin
DoSomething;
with (TSomeObject.GetMyIntf) do
begin
DoStuff;
DoMoreStuff;
end; // <- expected: TSomeObject gets destroyed because its ref.count is decreased to 0
DoSomethingElse;
end; // <- this is where TSomeObject.Destroy actually gets called
Всякий раз, когда кто-то начинал старый аргумент "with
является злом", это всегда был единственный пример, который я имел в виду, который заставлял меня говорить "Да, но ...". Похоже, я был неправ ... Кто-нибудь может подтвердить?