Die Äußerungen beziehen sich auch nur auf den Fall, wo auch ein Reference-Counting stattfindet - genauer dieses zum Destroy der Instanz führt. Dies gilt z.B. bei allen Abkömmlingen von
TInterfacedObject
. Damit im Create einer solchen Klasse das RefCounting keinen Ärger macht (dort gibt es nämlich noch keine Interface-Referenz, die das Objekt am Leben halten könnte), wird im
TInterfacedObject.NewInstance
der RefCount künstlich auf 1 gesetzt:
Delphi-Quellcode:
// Set an implicit refcount so that refcounting during construction won't destroy the object.
class function TInterfacedObject.NewInstance: TObject;
begin
Result := inherited NewInstance;
TInterfacedObject(Result).FRefCount := 1;
end;
Dies wird dann im AfterConstruction wieder zurückgenommen:
Delphi-Quellcode:
procedure TInterfacedObject.AfterConstruction;
begin
// Release the constructor's implicit refcount
AtomicDecrement(FRefCount);
end;
Die darauf folgende Zuweisung auf eine Interface-Referenz sorgt dann wieder für das korrekte RefCounting.
Beim Destroy gibt es aber eine sehr ähnliche Problematik, wenn z.B. im Destroy irgendwelche RefCounting relevante Befehle ausgeführt werden. Dort wählt man aber mittlerweile (seit XE7 - in älteren Versionen crasht das noch) einen anderen Weg über ein Flag namens
objDestroyingFlag.
Wie immer muss man halt genau wissen was man tut.