2012-03-14 4 views
5

Добрый день! Функция 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); 

Спасибо заранее! Vojtech

ответ

6

Для ответа на вопрос вам нужно проверить, как 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 поэтому, возможно, ваш фактический код выглядит несколько иначе.

+0

+1 Обычно я стараюсь разделить использование интерфейса с использованием объекта. Спасибо за информацию. Поэтому, если добавить после результата: = (RIO as IInvokable); две новые строки Результат: = nil; Showmessage (Rio.URL), это вызовет AV, верно? – Justmade

+0

@Justmade Да, я думаю, будет AV –

+0

Нет, не обязательно. Возможно, что объект все еще может функционировать более или менее. Вы получаете AV, только если вызов на URL ссылается на указатель NIL (или другое значение указателя, которое также вызывает AV) – dummzeuch

Смежные вопросы