Delphi 这里的观察器实现是否存在内存泄漏?

Delphi 这里的观察器实现是否存在内存泄漏?,delphi,design-patterns,memory-leaks,Delphi,Design Patterns,Memory Leaks,也许我对德尔福不太了解,但我想问你: 在这个网站上:我发现了一个基于iterface的观察者模式的实现 执行“附加”时,会调用此命令: procedure TSubject.Attach(Observer: IObserver); begin if fObservers = nil then fObservers := TInterfaceList.Create; fObservers.Add(AObserver); Notify; end; 在分离中,它有

也许我对德尔福不太了解,但我想问你:

在这个网站上:我发现了一个基于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;
过程tsObject.Detach(观察者:IObserver);
开始
如果fobserver为nil,则
开始
移除(AObserver);
如果fobserver.Count=0,则
fobserver:=nil;
结束;
结束;
如果是:

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;
过程tsObject.Detach(观察者:IObserver);
开始
如果fobserver为nil,则
开始
移除(AObserver);
如果fobserver.Count=0,则开始
免费;
fobserver:=nil;
结束;
结束;
结束;

无需添加
fobserver.Free语句
i接口将负责添加和释放
fobserver

Delphi使用
\u AddRef和_Release
来管理接口对象的生命周期

将接口引用分配给接口变量时,Delphi会自动调用
\u AddRef

当变量超出范围时,Delphi自动调用
\u Release


要了解更多信息,请浏览。

不,不应该,因为正如巴拉特所说,界面会处理好的。请注意,在您参考的示例中,fobserver被声明为IInterfaceList。这是一个界面。Delphi中的接口变量类似于C++中的智能指针,它们自动调用赋值的AdAdReF和X释放。
另一方面,如果FOBServer被声明为TInterfaceList,那么它将是一个对象,并且对象在分配时不做任何特殊的事情,因此调用Free是正确的。

OMG它有一个垃圾收集器吗?为什么他们没有全部实现呢?Delphi不是一种完整的垃圾收集语言,用户定义的类型应该手动分配和释放。它只为一些内置类型(如字符串、动态数组和接口)提供自动收集,以便于使用。@通过自由使用接口,您无法获得与垃圾收集类似的结果。这意味着您的所有类都需要实现至少一个接口:
TMyClass=class(TInterfacedObject,IMyInterface)
。。。所有引用都应该是接口引用:
MyObject:IMyInterface
。请注意,循环引用可能会导致引用计数出现问题。@无:两个原因:因为它不是垃圾收集,而是引用计数,就像COM和其他实现COM接口的语言一样。Delphi对象模型比Delphi接口实现(COM在引入ActiveX之后变得非常流行,ActiveX是Delphi 1和Delphi 2之后的版本)。Delphi团队无法从头开始重写VCL/RTL,使其完全基于接口(就像微软出于同样的原因从未使用MFC那样)。此外,引用计数还有垃圾收集所没有的问题。问一个新问题。@none:Wow,尽管有缺点,引用计数确实被认为是垃圾收集();今天我学到了一些新东西,谢谢!我认为你“没有很好地执行”的说法太苛刻了;引用计数可能失败的原因通常是程序员对该机制的玩弄(通过故意添加/删除引用,或者通过将接口与手动释放的对象混合)。这也是在Delphi之外的COM世界中存在许多问题的原因:对于很多人来说,按照引用计数规则进行操作是很困难的。如果FOBServer被声明为TInterfaceList,则备注+1。