Почему _AddRef и _Release не вызываются на моем объекте Delphi? - PullRequest
2 голосов
/ 13 октября 2010

Я действительно запутался.

// initial class
type
    TTestClass = 
        class( TInterfacedObject)
        end;

{...}

// test procedure
procedure testMF();
var c1, c2 : TTestClass;
begin
    c1 := TTestClass.Create(); // create, addref
    c2 := c1; // addref

    c1 := nil; // refcount - 1

    MessageBox( 0, pchar( inttostr( c2.refcount)), '', 0); // just to see the value
end;

Он должен показывать 1, но показывает 0. Независимо от того, сколько назначений мы выполним, значение не изменится!Почему нет?

Ответы [ 2 ]

14 голосов
/ 13 октября 2010

Refcount изменяется только при назначении переменной интерфейса, а не переменной объекта.

procedure testMF(); 
var c1, c2 : TTestClass; 
    Intf1, Intf2 : IUnknown;
begin 
    c1 := TTestClass.Create(); // create, does NOT addref
    c2 := c1; // does NOT addref 

    Intf1 := C2;  //Here it does addref
    Intf2 := C1;  //Here, it does AddRef again

    c1 := nil; // Does NOT refcount - 1 
    Intf2 := nil; //Does refcount -1

    MessageBox( 0, pchar( inttostr( c2.refcount)), '', 0); // just to see the value 
    //Now it DOES show Refcount = 1
end; 
2 голосов
/ 13 октября 2010

Компилятор не добавляет никакого кода для подсчета ссылок, если вы присваиваете его переменной типа. Счет пересчета никогда не был установлен на 1, намного меньше 2.

Вы увидите ожидаемое поведение, если объявите c1 и c2 как IInterface вместо TTestClass.

...