“ARC” – das Speicher-Management von Delphi für iOS, Teil 1

Disclaimer: Die Informationen über “Delphi für iOS” kommen aus dem derzeitigen Entwicklungsstand. Embarcadero hat mich von der Verschwiegenheits-Pflicht entbunden und mir ausdrücklich gestattet, über “Delphi für iOS” zu berichten.

Die drei Buchstaben “ARC” stellen ein Akronym dar und stehen für “Automatic Reference Counting”. Das Thema “automatische Referenz-Zählung” ist bei Delphi nicht vollständig neu, wir kennen es seit Delphi 2 bei Strings, deren Speicher automatisch freigegeben wird, wenn sie nicht mehr verwendet werden. Seit Delphi 3 kennen wir es bei Interfaces. Und nun ist die Referenz-Zählung auch für “normale” Objekte aktiv – zumindest bei dem neuen iOS-Compiler. Was das konkret bedeutet, werde ich im Folgenden darlegen.

ARC bedeutet, dass ein Objekt freigegeben wird, sobald keine Referenzen mehr auf dieses Objekt verweisen.

Bevor ich auf die näher Hintergründe eingehe, sehen wir uns kurz ein Code-Beispiel an:

1
2
3
4
5
6
procedure DoSimpleARC;
var m : TMyClass;
begin
  m:= TMyClass.Create;
  m.DoSomething;
end;

Aus der klassischen Delphi-Perspektive betrachtet, sieht dies nach einem klaren Speicherloch aus: Eine Instanz der Klasse TMyClass wird erzeugt, verwendet und nicht explizit freigegeben.

Die lokale Variable “m” ist die einzige Referenz auf das erzeugte Objekt. Mit Beenden der Prozedur verfällt natürlich auch diese lokale Variable und damit die einzige Referenz auf das Objekt. Ich schrieb eingangs, dass unter ARC ein Objekt freigegeben wird, wenn die letzte Referenz wegfällt und genau das passiert hier: Der Destruktor von “m” wird aufgerufen und das Objekt wird danach freigegeben. Kein Speicherloch.

Das ist es, was ARC ausmacht: Ohne, dass es explizit ausprogrammiert werden muss, wird erst der Destruktor aufgerufen und dann das Objekt freigegeben. Das alles passiert ganz konkret um den Zeitpunkt des Verschwindens der letzten Referenz auf ein Objekt. Diesen können wir natürlich steuern:

1
2
3
4
5
6
7
8
procedure DoSimpleARC;
var m : TMyClass;
begin
  m:= TMyClass.Create;
  m.DoSomething;
  m:= NIL;  // ... do something else
end;

In Zeile #6 setze ich die lokale Variable auf “NIL”, auch damit eliminiere ich die einzige Referenz auf das zuvor erzeugte Objekt und erwirkte damit den Aufruf des Destruktors und das sofortige Freigeben des Objektes. ARC zeigt dabei ein deterministisches Verhalten, das Objekt wird unmittelbar bei Abarbeitung von Zeile #6 freigegeben.

Objekte werden also kontrolliert freigegeben, ohne dass im Code auch nur ein einziger expliziter Aufruf von “.Free” erfolgt. Da stellt sich doch die Frage, was bei bestehendem Code passiert, der üblicherweise mit einem Aufruf “.Free” arbeitet. Nichts – wirklich: Der Compiler, der “Delphi für iOS” antreibt, ersetzt dem Aufruf von “.Free” durch ein Zuweisen mit NIL (analog zu Zeile #6 aus dem obigen Beispiel). Bestehender Code kann damit (meist) auch parallel mit den Win32-/Win64-Compilern weiter verwendet werden. Letztere werden den Aufruf von “.Free” ja wie bisher behandeln.

Der letzte Absatz deutet es schon an: Der Compiler ist derjenige welche, der für ARC verantwortlich ist und die jeweils richtigen Moment abpasst, um einen Destruktor aufzurufen und ein Objekt freizugeben. Das bedeutet insbesondere, dass hier kein Garbage-Collector im Hintergrund am Werk ist.

ARC entbindet den Entwickler damit über weite Strecken von der Pflicht, sich um das Freigeben seiner Objekte zu kümmern. Ganz ausschalten sollte man sein Hirn bei der Programmierung nie – aber Dank ARC hat man als Entwickler wieder mehr Ressourcen für die eigentliche” Arbeit verfügbar.

ARC ist ein breitgefächertes Thema. Dieser erste Blog-Eintrag dazu soll lediglich ein Grundverständnis für den Einstieg verschaffen. Weitere Einträge werden folgen, die dann speziellere Aspekte beleuchten werden.

2
Daniel Wolf

About the Author:

Daniel Wolf ist als Software-Architekt im Miniatur Wunderland Hamburg tätig, war zuvor viele Jahre als technischer Berater tätig und spricht regelmäßig auf Konferenzen. Er betreibt das Forum "Delphi-PRAXiS". » Mehr Details zur Person
  Verwandte Blog-Einträge