2012-03-14 7 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._AddRefIInterface._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私は通常、オブジェクトの使用法とインターフェイスの使い分けを区別しています。情報をありがとう。だから我々は後に追加結果:=(IInvokableとしてRIO); 2つの新しい行結果:= nil; Showmessage(Rio.URL)AVを引き起こすでしょうか? – Justmade

+0

@ジャストメイドはい私はAVと思うだろう –

+0

いいえ、必ずしもそうではありません。オブジェクトはまだ多かれ少なかれ機能することが可能です。 URLへの呼び出しがNILポインタ(またはAVを引き起こす別のポインタ値)を参照する場合にのみ、AVを取得します。 – dummzeuch

関連する問題