参照カウントの不使用

提供: RAD Studio
移動先: 案内検索

インターフェイス オブジェクトのメモリ管理 への移動


オブジェクトは、別のコンポーネントに所有されるコンポーネントまたはコントロールの場合、TComponent に基づいた異なるメモリ管理システムの一部になっています。TComponent コンポーネントとインターフェイス参照カウントのオブジェクト存続時間管理アプローチを組み合わせているクラスもありますが、これを正しく実装するのは大変です。

インターフェイスをサポートしながらインターフェイス参照カウント メカニズムを回避するコンポーネントを作成するには、_AddRef メソッドと _Release メソッドを、たとえば次のように実装する必要があります。

function TMyObject._AddRef: Integer;
begin
  Result := -1;
end;
function TMyObject._Release: Integer;
begin
  Result := -1;
end;

それでも、QueryInterface を通常どおり実装して、オブジェクトに対する動的問い合わせを実現することも可能ではあります。

なお、QueryInterface を実装するので、インターフェイス識別子(IID)を作成する限り、インターフェイスに対して as 演算子を依然として使用することができます。集約を使用することもできます。外側のオブジェクトがコンポーネントの場合は、"制御側の Unknown"(Controlling Unknown)への委譲により、内側のオブジェクトは通常どおり参照カウントを実装します。_AddRef メソッドと _Release メソッドを回避して別のアプローチでメモリ管理を処理することを決定するのは、外側のオブジェクトのレベルです。実際、インターフェイス存続時間モデルに従わないオブジェクトを外側の包含オブジェクトとする、集約の内側のオブジェクトの基底クラスとして TInterfacedObject を使用できます。

メモ: "制御側の Unknown" は、外側のオブジェクトやオブジェクト全体の参照カウントの維持管理対象で実装される IUnknown です。IUnknownIInterface と同じですが、COM ベースのアプリケーション(Windows 専用)で代わりに使用されます。外側および内側のオブジェクトによる IUnknown インターフェイスまたは IInterface インターフェイスのさまざまな実装の詳細については、「集約」と "制御側の Unknown" に関する Microsoft のオンライン ヘルプ トピックを参照してください。

関連項目