也许我不太了解delphi,但我想问你:
在这个网站:http://blogs.teamb.com/joannacarter/2004/06/30/690我发现了一个基于iterface的观察者模式的实现。
进行连接时,会调用此方法:
procedure TSubject.Attach(Observer: IObserver);
begin
if fObservers = nil then
fObservers := TInterfaceList.Create;
fObservers.Add(AObserver);
Notify;
end;
并且在分离中它有代码
procedure TSubject.Detach(Observer: IObserver);
begin
if fObservers <> nil then
begin
fObservers.Remove(AObserver);
if fObservers.Count = 0 then
fObservers := nil;
end;
end;
应该是:
procedure TSubject.Detach(Observer: IObserver);
begin
if fObservers <> nil then
begin
fObservers.Remove(AObserver);
if fObservers.Count = 0 then begin
fObservers.Free;
fObservers := nil;
end;
end;
end;
答案 0 :(得分:6)
另一方面,如果fObservers被声明为TInterfaceList,那么它将是一个对象,并且对象在赋值时不做任何特殊操作,所以调用Free是正确的。
答案 1 :(得分:5)
无需添加fObservers.Free;
语句。 IInterface
将负责添加和发布fObservers
。
Delphi使用_AddRef and _Release
来管理接口对象的生命周期。
当您为接口变量分配接口引用时,Delphi会自动调用_AddRef
。
当变量超出范围时,Delphi会自动调用_Release
。
有关详情,请浏览this link。