Это объект или интерфейс? Мне нужно освободить это или нет? - PullRequest
5 голосов
/ 14 марта 2012

Добрый день!Функция GetService создает экземпляр класса THTTPRIO и возвращает его как IInvokable.Я использую этот интерфейс / объект в другой функции.Должен ли я освободить его или нет, когда он мне больше не нужен?Интерфейсы не нужно освобождать, но меня смущает тот факт, что RIO создается как объект класса THTTPRIO.

function GetService(Addr: string): IInvokable;
var
  RIO: THTTPRIO;
begin
  RIO := THTTPRIO.Create(nil)
  RIO.URL := Addr;
  Result := (RIO as IInvokable);
end;

Где:

IInvokable = interface(IInterface);
THTTPRIO = class(TComponent, IInterface, IRIOAccess);

Заранее спасибо!Войтех

1 Ответ

6 голосов
/ 14 марта 2012

Чтобы ответить на вопрос, вам необходимо проверить, как IInterface._AddRef и IInterface._Release реализованы для этого класса.Они выглядят так:

function TRIO._AddRef: Integer;
begin
  Result := TInterlocked.Increment(FRefCount);
end;

function TRIO._Release: Integer;
begin
  Result := TInterlocked.Decrement(FRefCount);
  if (Result = 0) and not (Owner is TComponent) then
    Destroy;
end;

Это означает, что временем жизни объекта управляет подсчет ссылок интерфейса.Это означает, что ваш код правильный и не пропускает.

Обратите внимание, что если вы передали Owner в конструкторе, то владельцем будет управлять временем жизни.

Ваш кодвсе еще в некоторой степени подвержен утечке, если значение URL повышается.Я бы написал так:

function GetService(const Addr: string): IInvokable;
begin
  Result := THTTPRIO.Create(nil);
  (Result as IRIOAccess).RIO.URL := Addr;
end;

Сказав все это, класс THTTPRIO не поддерживает IInvokable, поэтому, возможно, ваш реальный код выглядит немного иначе.

...