TForm의 _release 메서드가 소멸자를 호출하지 않는 이유는 무엇입니까?TForm의 _release가 소멸자를 호출하지 않는 이유는 무엇입니까?
function TInterfacedObject._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
function TComponent._Release: Integer;
begin
if FVCLComObject = nil then
Result := -1 // -1 indicates no reference counting is taking place
else
Result := IVCLComObject(FVCLComObject)._Release;
end;
의 TInterfacedObject의 _release이 매우 이해할 것 같지만 TComponent의의 _release이하는 일 :
var
F, U : IUnknown;
procedure TForm1.btn1Click(Sender: TObject);
begin
U := IUnknown(TMyObject.Create); // MyIterfacedObject (inherits TInterfacedObject)
F := IUnknown(TMyForm.Create(nil));
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
U := nil; // Calls destructor
F._Release; // Does not call destructor
F := nil; // Does not call destructor
end;
나는 TInterfaceObject 및 TComponent의 클래스의 _release 방법을 살펴했다? 이상하게 보입니다 ...
두 가지 일반적으로 사용되는 패턴 외에도 소유자 패턴을 언급해야한다고 생각합니다. 특히 OP가 무엇을 의미하는지 TComponent에서 사용되기 때문입니다. – iamjoosy
답을 다시 읽었을 때 TComponent는 첫 번째 예제 (TMyObject를 사용)에서 패턴을 따르지 않지만 할 수는 있지만 TComponent 자손의 상속 패턴은 소유권 모델이라고합니다. – iamjoosy
@iamjoosy '소유자'로 전달되는 내용에 따라 다릅니다. 'nil '을 건네면 호출자는 소유자로 남아 있습니다. 'nil '이외의 것을 전달하면 다른 것이 소유자가됩니다. 근본적으로 같은 것입니다. –