我希望引用計數應該在接口實現中的外部聚合對象上工作。 如果我可以參考另外一個例子:Clarity in classes implementing multiple interfaces (alternative to delegation):德爾福接口實現
這裏是行爲的最小再現:
program SO16210993;
{$APPTYPE CONSOLE}
type
IFoo = interface
procedure Foo;
end;
TFooImpl = class(TInterfacedObject, IFoo)
procedure Foo;
end;
TContainer = class(TInterfacedObject, IFoo)
private
FFoo: IFoo;
public
constructor Create;
destructor Destroy; override;
property Foo: IFoo read FFoo implements IFoo;
end;
procedure TFooImpl.Foo;
begin
Writeln('TFooImpl.Foo called');
end;
constructor TContainer.Create;
begin
inherited;
FFoo := TFooImpl.Create;
end;
destructor TContainer.Destroy;
begin
Writeln('TContainer.Destroy called');//this line never runs
inherited;
end;
procedure Main;
var
Foo : IFoo;
begin
Foo := TContainer.Create;
Foo.Foo;
end;
begin
Main;
Readln;
end.
如果不是使用implements
,我實現了在TImplementor
類的接口,那麼析構函數運行。
「我錯過了什麼嗎?」我不知道。但我們當然是。你忘了包含代碼!表明行爲的完整程序是必需的。否則,我們必須猜測。 – 2013-04-25 09:24:34
你有一些額外的引用或引用循環。爲TFirstSecond._AddRef和TFirstSecond._Release添加重寫並在其中放置斷點,獲取完整的引用列表並查看哪些未被清除 – 2013-04-25 10:43:03
問題是,您的接口已委派。不知道爲什麼會導致這種行爲。 – 2013-04-25 13:37:46