Einzelnen Beitrag anzeigen

Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.142 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 11:33
Das „reference counting“ finde ich z. B. nach meinem derzeitigen Verständnis von interfaces gelinde gesagt sche.. ääh nicht gut.
Genau das war mein Grund sich näher mit Interfaces zu beschäftigen... Thema Arc unter Windows... Um eine FMX App gleicht unter Mobil und Windows zu programmieren, nimmt man keine Objecte, sondern Interfaces, so mit gibt es keinen Plattformunterschied.


Und das hat genau was mit Interfaces zu tun?
Frage an mich? Hast nix gequotete... Nur so kann ich etwas verwenden ohne einen Link zu Klasse...



Referenzzählung:
...

Eigentlich ist das eine ganz nette Sache, aber es hat zwei Haken:
Wen ich in aMotor ein Motor-Interface habe und ich Nil zuweise (aMotor := Nil) kann es sein, dass das Objekt noch nicht freigegeben wird, weil irgendwo im Speicher möglicherweise noch ein Zugriff auf dieses Interface existiert (z.B. in einer Liste oder so).
Durch meine Nil-Zuweisung wird der RefCounter verringert (z.B. von 2 auf 1) und das Objekt aber erst bei 0 freigegeben.

Für die Liste existiert der Motor noch.
Wenn man mit Objekten arbeitet und hier aMotor.Free angegeben hätte, könnte es später bei Zugriff auf die Motoren-Objekte in der Liste knallen.

Bei Motoren-Interfaces in der Liste knallt nix, da das Objekt noch nicht freigegeben wurde.

Wenn ich aber vorhin das Objekt wirklich FREIGEBEN wollte, dann kann das Projekt den Motor noch verwenden, der eigentlich aber nicht mehr existieren sollte.

Ok, welche fehlerhafte Arbeit des Projektes ist die schlechtere? Das kann man so nicht entscheiden. Wichtig ist, dass man bei Vewrwendung von Interfaces mit Referenzzählung beachten muss, dass man nicht ohne weiteres in der Hand hat, wann das Objekt tatsächlich freigegeben wird.
Na zum Glück gibt es für Interfaces "jetzt" das Attribut [WEAK] somit bewirkt Dein Whatever := NIL, wenn Du alle anderen Referenzen mit [WEAK] geflaged hast wirklich ein Free...

Wenn ich etwas in einer Liste speichere, und das "Ding" an andererstelle Frei geben, dann wollte ich es - wenn es in der Liste ist - sicherlich noch verwenden, oder?

Ich brauche einfach nicht die Try Finally ketten...

Delphi-Quellcode:
begin
  AFoo := TFoo.Create;
  try
    ABar := TBar.Create;
    try
      AFile := TFilestream.Create(..)
      try
        ABar.LoadFormStream(AFile);
        AFoo.Add(ABar);
        AFoo.Machwas;
      finally
        AFile.Free;
      end;
    finally
      ABar.free; // ggf. könnte ich das AFoo überlassen, aber dann würde ich im Source immer darüber stolpern.
    end;
  finally
   AFoo.Free;
  end;
end;
oder

Delphi-Quellcode:
begin
  IFoo := TFoo.Construct(TBar.Construct(TiFile.Construct(..)));
  IFoo.Machwas;
end;
Mavarik
  Mit Zitat antworten Zitat