2016-09-12 1 views
-4

Ich habe über ARC gelesen und ich sehe, dass es nicht von jedem Compiler unterstützt wird. Also denke ich, dass Delphi nicht die gleiche Art und Weise hat, den Speicher in jedem Szenario zu verwalten, richtig? Es hängt vom Compiler ab.Delphi ARC Compiler Speicherverwaltung

Ich habe dies gegooglet, aber ich finde die Unterschiede in der Speicherverwaltung zwischen "klassischen" Delphi und ARC Delphi schwer zu verstehen. Von dem, was ich verstanden habe, ruft es Free automatisch, also was ist der Unterschied im Code?

Bitte geben Sie mir einen Code Beispiel wenn möglich.

+0

Sie möchten wissen, ob Sie Free verwenden müssen oder nicht? –

+0

Auch, weil ich sehe, dass ich es nicht verwenden kann und ich etwas mit Null tricksen muss ... aber der Versuch-endlich-Block verschwindet korrekt? –

+0

Warum runter zu diesem Thema? –

Antwort

3

Zunächst einmal, empfehle ich Ihnen die Dokumentation aussehen, wenn Sie nicht bereits haben:

Automatic Reference Counting in Delphi Mobile Compilers.

Hier finden Sie eine vollständige Erläuterung zu diesem Thema.


Automatische Referenzzählung

Speicherverwaltung in Delphi ist nicht immer gleich, weil, wenn Sie einen ARC-fähigen Compiler verwenden, die Dinge ändern werden.

Um es kurz zu machen, ist ARC eine Möglichkeit, die Lebensdauer eines Objekts zu verwalten, ohne sich um ein Objekt kümmern zu müssen, das Sie nicht benötigen.

Dies ist, wie Sie normalerweise die Objekte verwenden (nicht ARC)

var 
a: TMyNiceClass; 
begin 

a := TMyNiceClass.Create; 
try 
    a.somethingToDo(); 
finally 
    a.Free; 
end; 

end; 

Hier muss ich in einem try-finally Block den Code setzen, so bin ich sicher, dass mein Objekt weggeht, wenn ich brauche es nicht mehr (und ich vermeide Speicherlecks). Stattdessen unter ARC:

var 
a: TMyNiceClass; 
begin 

a := TMyNiceClass.Create; 
a.somethingToDo(); 

end; 

Der obige Code funktioniert gut, unter ARC, weil Sie nicht zu Free und weder die try-finally verwenden müssen, da sie „automatisch“ ist. Beachten Sie auch, dass der Destruktor aufgerufen wird, wenn Sie das Ende erreichen; Anweisung, aber wenn Sie aufhören möchten, das Objekt vor dem Ende zu verwenden, können Sie a := nil verwenden.

Hinweis

Im traditionellen Stil Free Aufruf ruft die destructor (es sei denn, der Verweis auf das Objekt war gleich Null), die Referenz auf das Objekt = nil die Free weist in ARC-Stil.

+0

Ok gut. Aber Speicherlecks sind die auf dem Haufen? Was ist mit einem Freeandnil? –

+0

Speicherlecks treten auf, wenn Sie viele Objekte aufrufen, diese jedoch nicht freigeben. FreeAndNil gibt das Objekt frei und setzt seinen Verweis auf null. –

+0

Und was ist besser zwischen Free und Freeandnil? –

-2

ARC kann verwirrend sein, wie in Delphi-Compiler implementiert. Es ist ein unnötiger Kompatibilitätsschalter.

Möglicherweise benötigen Sie ein Buch, um es richtig zu machen: Delphi Memory Management For Classic And ARC Compilers.

Auszug aus dem 4. Cover:

Delphi bietet eine Vielzahl von Typen mit ihrer eigenen Speicherverwaltung Logik, sowie zwei Sätze von Compilern, die unterschiedlichen Speichern Managementsysteme für die Klassen bieten.

  • Klassische Delphi-Compiler derzeit auf Windows und OSX Plattformen unterstützt - manuelle Speicherverwaltung mit, während ARC für bestimmte Arten bereitstellt.
  • ARC-Delphi-Compiler der nächsten Generation, unterstützt auf mobilen Android- und iOS-Plattformen sowie unter Linux - mit vollem ARC - Automatische Referenz Zählen Speicherverwaltung.

Jedes Speicherverwaltungssystem hat seine guten und schlechten Seiten. Jedes bietet Lösungen für einige Probleme, aber schafft eine ganze Reihe von anderen Probleme. Und jeder erfordert etwas andere Codierungsmuster und Praktiken. Die Stärken und Schwächen zu kennen und zu verstehen, wie Speicher-Management-System (e) arbeiten, geht Hand in Hand mit dem Schreiben sauber, Bug-freie und wartbare Code.

+0

Vielen Dank für Ihre persönliche Meinung und die Kopie/Paste –

+0

Es ist eine Tatsache, dass, wenn Sie ein Buch benötigen, um es zu verstehen, und wenn Sie diese Frage oben gefragt haben, dass ARC verwirrend ist. Das Kopieren und Einfügen wird als solches identifiziert und ist eine sehr gute Zusammenfassung des ganzen Punktes. –