Реализация наблюдателя здесь имеет утечку памяти? - PullRequest
3 голосов
/ 27 октября 2010

может быть, я не очень хорошо знаю Delphi, однако я хочу спросить вас:

на этом сайте: http://blogs.teamb.com/joannacarter/2004/06/30/690 я нашел реализацию шаблона наблюдателя, основанного на интерфейсе.

при выполнении присоединения происходит вызов этого:

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;

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

Нет, не должно, потому что, как сказал Бхарат, IIinface будет заботиться об этом. Обратите внимание, что fObservers объявлен как IInterfaceList в примере, к которому вы обращаетесь. Это интерфейс. Переменные интерфейса в Delphi похожи на интеллектуальные указатели в C ++, они автоматически вызывают _Addref и _Release для назначений.

Если fObservers был объявлен как TInterfaceList, с другой стороны, тогда это был бы объект, и объекты не делают ничего особенного в присваивании, поэтому было бы правильно вызвать Free.

5 голосов
/ 27 октября 2010

Нет необходимости добавлять fObservers.Free; оператор.IInterface позаботится о добавлении и освобождении fObservers.

. Delphi использует _AddRef and _Release для управления временем жизни сопряженных объектов.

Когда вы назначаете интерфейсную ссылку на интерфейсную переменную, Delphi автоматически вызывает _AddRef.

Когда переменная выходит из области видимости, Delphi автоматически вызывает _Release.

Для получения дополнительной информации перейдите по этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...