2017-06-22 13 views
0

基本的な質問。 Button1Clickでは、インターフェイスオブジェクトを作成します。作成後の参照カウントは0です。 オブジェクトを引数として渡します。 Refカウントが増加し、関数の終わりに減少し、0になると、関数は破壊されます。私は何かが恋しいですか?最初にオブジェクトを作成すると、refカウントが1になると思っていましたか? lListFilterはオブジェクトへの参照を保持していませんか? Button1Clickデルファイインタフェースでの参照カウント

type 
    IPersistentListFilter = Interface(IInterface) 
     ['{57cdcf89-60ee-4b3c-99fd-177b4b98d7e5}'] 
     procedure IncludeObject; 
end; 

procedure FillList(AFilter : IPersistentListFilter); 

type 
TPersistentListFilter = class(TInterfacedObject, IPersistentListFilter) 
    procedure IncludeObject; 
    constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

procedure FillList(AFilter: IPersistentListFilter); 
begin 
    AFilter.IncludeObject; 
end; 

constructor TPersistentListFilter.Create; 
begin 
    inherited; 
end; 

destructor TPersistentListFilter.Destroy; 
begin 
    inherited; 
end; 

procedure TPersistentListFilter.IncludeObject; 
begin 
    // do nothing 
end; 

procedure TForm8.Button1Click(Sender: TObject); 
var 
    lListFilter: TPersistentListFilter; 
begin 
    lListFilter := TPersistentListFilter.Create; 
    // ref count is 0 
    FillList(lListFilter); 
    // lListFilter has been destroyed 
    FillList(lListFilter); // --> error 
end; 

答えて

2

lListFilterTPersistentListFilter、ないIPersistentListFilterのインスタンスとして宣言されます。したがって、lListFilterが作成されたときに参照カウントは発生しません。

lListFilterIPersistentListFilterとして宣言する必要があります

procedure TForm8.Button1Click(Sender: TObject); 
var 
    lListFilter: IPersistentListFilter; 
begin 
    lListFilter := TPersistentListFilter.Create; 
    // ref count will be 1 

    // ref count will go to 2 during call to FillList 
    FillList(lListFilter); 

    // ref count will be back to 1 

    // ref count will go to 2 during call to FillList 
    FillList(lListFilter); 

    // ref count will be back to 1 

end; // ref count will go to 0 as lListFilter goes out of scope 
     // and is destroyed. 
+0

Thnksデイブを!今度は.createがrefカウントを増加させなかったのは明らかですが、なぜFillList(lListFilter)がTPersistentListFilter ..と誤って宣言されているのかについてrefカウントを増やした理由が混乱しています。 – siwmas

+1

'FillList'は' IPersistentListFilter'引数 –

+0

'FillList'の 'AFilter'パラメータは 'IPersistentListFilter'として宣言されています。 'lListFilter'は 'TPersistentListFilter'ではなく 'IPersistentListFilter'として渡されます* –

関連する問題