Weil du genau genommen Objekte nicht auf nil setzen kannst. Du kannst Variablen die auf Objekte verweißen auf nil setzen.
Und genau darin besteht das Problem. Du kannst 10 verschiedene Variablen haben die alle auf das selbe Objekt verweisen.
Aber weder der Compiler noch sonst wer weiß wer oder was evtl. noch Referenzen auf ein Objekt hat um die entsprechenden Variablen beim Freigeben auf nil setzen zu können.
FreeAndNil ist im Grunde nichts anderes als
Delphi-Quellcode:
objVar.Free;
objVar := nil;
Aber bei FreeAndNil musst du auch explizit die Variable übergeben die du dann auf nil setzen willst.
Mal ein Beispiel:
Delphi-Quellcode:
objVar1 := TObject.Create;
objVar2 := objVar1;
objVar3 := objVar1;
FreeAndNil(objVar1);
Das Objekt hinter objVar1 wird freigegeben und objVar1 ist nil.
objVar2 und objVar3 sind aber immernoch <> nil und zeigen auf den Speicherbereich wo das Objekt vorher war.
Ein Zugriff oder sogar ein weiterer Aufruf von Free oder FreeAndNil auf objVar2 oder objVar3 führt zu einer Zugriffsverletzung.
Aber das Grundverständnisproblem was du hast ist, dass die Variable nur eine Referenz (einen Pointer) auf das eigentliche Objekt im Speicher enthält.
Es macht logisch gesehen daher gar keinen Sinn davon zu sprechen dass sich das Objekt selbst auf nil setzt.