Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Automatic Reference Counting und neue Projektvorlagen

Mit der Einführung des LLVM Compilers Version 3.0 in Xcode wurde den Entwicklern mit Automatic Reference Counting (ARC) ein Werkzeug in die Hand gegeben, welches sie von der mühevollen Aufgabe entbindet, retain und release Anweisungen zu schreiben. Da besonders diese Befehle als Gefahrenquelle für Programmfehler gelten, ist ARC von vielen Programmierer eine gerne gesehenen Neuerung.
Leider ist ARC keine Weiterentwicklung von Objective-C und die Sprache ist keineswegs in der Lage auf retain und release zu verzichten. Durch Automatic Reference Counting ist es jetzt nur Aufgabe des Compilers, die Anweisungen an den richtigen Stellen im Programmcode einzusetzen. Vor jeder Übersetzung wird der Programmcode daher ausgiebig analysiert.

Da ARC direkt den Programmcode manipuliert, sind während der Laufzeit der Anwendung keine zusätzlichen Komponenten erforderlich und ARC kann sowohl für OS X, als auch für iOS Projekte eingesetzt werden. Das ist eine positive Entwicklung, denn eine Speicherverwaltung mit dem in Objective-C 2.0 vorgestellten Garbage Collector ist auf iOS Geräten weiterhin nicht möglich. Mit der Einführung von ARC ist es auch fraglich, ob es auf diesen Geräten jemals einen Garbage Collector geben wird, da dieser die Prozessorlast eine Anwendung nicht unwesentlich erhöhen würde.

Bereits wenn ein neues Projekt angelegt wird, fragt Xcode ob Automatic Refence Counting verwendet werden soll. Entscheidet man sich für die klassische Programmierung mit retain und release genügt es, die Kontrollkästchen Use Automatic Reference Counting zu deaktivieren.
stacks_image_117B778F-B30C-427A-B1B9-7D1D30582120
stacks_image_69DE7F3E-9C26-4556-AAAA-33A6A72A4C4B
Auch die aus dem Projektvorlagen generierte Programme unterscheiden sich jetzt ein wenig von ihren Vorläufern in den älteren Xcode Versionen. Hatte die main-Methode eines einfachen Command Line Tool in der Vergangenheit noch einen detailliert programmierten Autoreleasepool, kommt man seit der Einführung des LLVM Compilers mit erheblich weniger Anweisungen aus.

Alte main-Methode:
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSLog(@"Hello, World!");

    [pool drain];
    return 0;
}
Neue main-Methode:
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    @autoreleasepool {

    // insert code here...
    NSLog(@"Hello, World!");

    }
    return 0;
}
Allerdings wird auch in Projekten mit inaktivem ARC von Xcode die neue Version der main-Methode erzeugt, denn @autoreleasepool ist keine Anweisung, die sich auf Automatic Reference Counting bezieht. Es ist eine besonderer Befehl für den LLVM Compiler und nach Aussagen des Herstellers erheblich schneller als die Verwendung von NSAutoreleasePool.

Automatic Reference Counting entbindet des Entwickler nicht nur von der Programmierung bestimmter Anweisungen zur Speicherverwaltung, ihre Verwendung wird regelrecht verboten. Sehr gut sichtbar ist dies bereits im Code Sense Fenster, wo bei aktiviertem ARC einige der vorgeschlagenen Anweisungen rot durchgestrichen sind.
stacks_image_A1DF943A-2436-4530-AFC8-82F49FA5253C
Versucht man trotzdem eine dieser Anwendungen zu implementieren, gibt es spätestens bei der Kompilierung eine Fehlermeldung. Das Programm kann mit der Anweisung und aktiviertem ARC nicht übersetzt werden.
stacks_image_E4F804F6-CF8A-4184-ACF5-1C2E6CD74047
Möchte man für ein Projekt im Nachhinein die ARC Einstellungen ändern, zum Beispiel, um Automatic Reference Counting für ein älteres Projekt zu aktivieren, führt der Weg über die Build Settings des Target. Die Einstellung Objective-C Automatic Reference Counting ist schnell zu finden, wenn man in das Suchfeld „automatic“ einträgt. Hier lässt sich ARC bequem ein- oder ausschalten.
stacks_image_CA415EA5-A39D-4E9D-8F73-13AE72C5844C
Sollen in einem Projekt nur bestimmte Dateien keine ARC verwenden, weil ältere Bibliotheken oder Frameworks zum Einsatz kommen, geschieht das ebenfalls über die Einstellungen des Target, in diesem Fall aber in der Gruppe Build Phases. Unter Compile Sources muss jeder Datei, die vom ARC ausgenommen werden soll, das Compiler Flag -fno-objc-arc zugewiesen werden.
stacks_image_FBB6C538-5B2D-462F-BA63-7C8335C53567