Zitat von
Khabarakh:
Genau. Es wäre ja wirklich sinnlos, wenn in
Free Self auf nil geprüft wird, aber schon beim Methodenaufruf wegen Self = nil eine
Exception ausgelöst würde.
Free ist aber genauso definiert:
Delphi-Quellcode:
Procedure TObject.Free;
Begin
If Self<>Nil Then Destroy;
End;
Das dient genau dazu, Nil-Referenzen auf Klassen 'aus Versehen' nochmals freizugeben, ohne das einem das Programm um die Ohren ballert.
Du kannst ohne Probleme TFooObject(4711).SomeMethod ausführen. Das klappt sogar, solange keine Felder der Klasse verwendet werden. Aber ich wiederhole ja nur das, was hier Andere schon geschrieben haben.
Zurück zum Thema:
Wenn Du mehrere Referenzen auf ein Objekt hast, dann benötigst Du Referenzzähler.
COM-Objekte implementieren das, und Delphi unterstützt
COM-Objekte. Schau mal in der Hilfe nach, wie mal
COM-Objekte deklariert und verwendet, eigentlich ganz einfach.
Prinzipiell geht das so: Bei jeder Referenz auf das Objekt erhöhst Du den Referenzzähler. Anstatt das Objekt freizugeben, rufst Du eine Methode 'Release' auf, in der Du den Zähler wieder erniedrigst. Wenn der Zähler 0 ist, gibst Du das Objekt wieder frei.
Delphi-Quellcode:
Function GetReferenceToMyObject : TMyObject;
Begin
If not Assigned (PrivateObject) Then
PrivateObject.Create;
PrivateObject.IncreaseRefCount;
End;
Procedure TPrivateObject.Release;
Begin
DecreaseRefCount;
If fRefCount = 0 Then Free;
End;
Aufpassen beim Anfassen der Refcounts: Am Besten sollte man das noch threadsicher kapseln (Oder, wie gesagt, COMs nehmen).