Objective-C

Lesezeit: 6 Minuten

Objective-C ist eine objektorientierte, an Smalltalk angelehnte Programmiersprache. Sie wurde in den 1980er Jahren von Brad Cox und Tom Love erfunden und 1988 von der Firma NeXT für das Betriebssystem NeXTSTEP lizensiert. Nachdem Apple 1996 NeXT akquirierte, wurde Objective-C intensiv für das damals frisch erschienene Betriebssystem Mac OS X und später iOS eingesetzt. 2006 ist Objective-C 2.0 erschienen und hat unter anderem eine automatische Speicherbereinigung und Unterstützung für 64bit-Systeme eingeführt. Mit der Ankündigung von Swift im Jahre 2014 hat Objective-C an Bedeutung verloren.

Alleinstellungsmerkmale

Objective-C ist lange Zeit die Programmiersprache für macOS und iOS gewesen. Außerhalb dieses Ökosystems gibt es wenig Gründe, Objective-C gegenüber einer anderen Sprache zu bevorzugen.

Einsatzbereiche

Teile von iOS und die graphische Benutzeroberfläche von macOS sind in Objective-C geschrieben. Cocoa, Apples macOS-API, ist überwiegend in Objective-C geschrieben. Objective-C ist, seit 2014 um Swift ergänzt, eine der wenigen offiziell unterstützten Sprachen zur Entwicklung auf iOS. Entsprechend viele iOS-Apps sind in Objective-C geschrieben.

GNUstep ist eine Open-Source-Implementierung von Cocoa, geschrieben in Objective-C. Der GNUstep-Software-Index listet ein paar Dutzend Applikationen auf, die in GNUstep / Objective-C geschrieben sind, unter anderem GNUMail und PikoPixel.

Pros

Objective-C ermöglicht die Umsetzung nativer iOS-Apps. Die Sprache verzichtet auf den Overhead eines Garbage Collectors und bietet mit ARC (Automatic Reference Counting) eine Alternative zur manuellen Speicherverwaltung, die auch ergänzend eingesetzt werden kann. Als Obermenge von C ermöglicht Objective-C den Zugriff auf das riesige Ökosystem derselbigen Sprache. Performancekritische Komponenten können in C geschrieben und aus Objective-C heraus verwendet werden. Objective-C selbst ist eine sehr gereifte Sprache mit einer großen Community.

Die Objektorientierung von Objective-C stammt aus der Sprache Smalltalk und basiert auf dem Konzept, dass Objekte Nachrichten austauschen, anstatt dass Methoden an Objekten aufgerufen werden. Ein interessantes Feature dabei sind Categories, die mit den Extension Functions der Sprache Kotlin vergleichbar sind. Categories erweitern eine Klasse nachträglich, ohne diese abzuleiten. Dadurch können zur Laufzeit auch für bestehende Klassen neue Funktionen hinzugefügt werden, die dann auch für eingebundene Bibliotheken gelten, die selbst nicht angepasst wurden.

Cons

Die von Smalltalk inspirierte Umsetzung der Objektorientierung in Objective-C ist für viele Entwickler, die mit anderen objektorientierten Sprachen vertraut sind, neu und erfordert einen größeren Einarbeitungsaufwand als etwa der Umstieg von Java auf C#. Zugleich unterscheidet sich diese Semantik stark von C, was den Code weiter verkompliziert, wenn auf C-Funktionen zugegriffen wird. Um die Kompatibilität zu wahren, sind Objective-C-Schlüsselwörter mit einem vorangestellten @ versehen. So handelt es sich bei @try um ein Schlüsselwort aus Objective-C, während while ein Schlüsselwort aus C ist. Bei @"Hello World" handelt es sich um einen Objective-C-String und bei @42 um ein numerisches Objective-C-Literal.

Aufgrund der Historie und um Namenskonflikte zu vermeiden, sind die Standardklassen mit einem vorangestellten NS versehen. So gibt es NSObject, NSString, NSDictionary, NSDate und so weiter. Das Kürzel ist im deutschsprachigen Raum nicht nur negativ konnotiert, ich halte es grundsätzlich nicht für eine gute Idee, allgemein verwendete Klassen mit Firmennamen zu versehen, die sich gerne mal ändern oder durch Akquisitionen obsolet werden. Das Pattern ist zu einem gewissen Grad nachvollziehbar, da Klassennamen in Objective-C nicht mehrfach vergeben werden dürfen, im Gegensatz zu anderen Sprachen, wo sie bei Namenskonflikten über vollständige Paketnamen oder Aliase eindeutig gemacht werden können. So werden die Klassen von Apples Betriebssystem-API Core Foundation mit dem Präfix CF versehen.

Objective-C ist eine sehr verbose Sprache. So heißt eine Funktion, die in vielen Sprachen als replace geläufig ist, in Objective-C stringByReplacingOccurrencesOfString:withString. In vielen Sprachen können Whitespaces am Anfang und Ende eines Strings mit einer Funktion trim entfernt werden. In Objective-C wird eine generischere Funktion verwendet und dieser ein Whitespaces-Set übergeben. Das sieht dann so aus: stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]. Für Ausgaben in StandardOut kann NSLog verwendet werden. Dabei wird neben dem übergebenen String aber auch ein Zeitstempel geschrieben, ähnlich wie man es in einer Logdatei haben möchte. Um nur den eigentlichen String auszugeben, bietet es sich dafür an, eine C-Funktion zu verwenden. Eine kapselnde print-Funktion in Objective-C könnte zum Beispiel so aussehen:

+ (void)print:(NSString*)str {
    fprintf(stdout, "%s", [str UTF8String]);
}

Das + kennzeichnet die Funktion als eine Klassenfunktion, ähnlich einer statischen Methode in Java. (void) ist der Rückgabetyp, print der Funktionsname, und str der Paramter, der vom Typ (NSString *), also ein Zeiger auf einen Objective-C-String, ist. [str UTF8String] ist Objective-C-Stil, um eine Nachricht UTF8String an str zu senden, ohne dabei Argumente mitzugeben. Der Rückgabewert ist ein C-kompatibler String, der an die C-Funktion fprintf zur Ausgabe des Strings im übergebenen Stream stdout gereicht wird.

Objective-C ist plattformspezifisch. Während die Entwicklung unter und für Linux und Windows möglich ist, gibt es viel zu beachten, wenn auf und für verschiedene Plattformen entwickelt wird. Zwar ist zum jetzigen Zeitpunkt nicht absehbar, dass Apple Objective-C in naher Zukunft als deprecated markieren wird, die Sprache wurde seit der Ankündigung von Swift im Jahr 2014 aber auch nicht mehr weiterentwickelt.

Datenblatt

NameObjective-C
Webseitehttps://developer.apple.com
Erscheinungsjahr1984
Aktuellste Version (Stand 8. Oktober 2023)Version 2.0 aus dem Jahr 2006
Typisierungstatisch
Paradigmenobjektorientiert, aspektorientiert
ProsCons
relativ schnell, geringer Speicherbedarf und kleine Kompilatesehr verbose Syntax
automatische Speicherbereinigung mit ARCkomplizierte Sprache, auch weil C-kompatibel und die Syntax von Objective-C sich von C sehr unterscheidet
Obermenge von C, Zugriff auf das C-Ökosystemhöherer Einarbeitungsaufwand für Umsteiger aus C-ähnlichen Sprachen als bei vergleichbaren Sprachen
gereifte Sprache, große Communityplattformspezifisch
interessante Sprachkonstrukte aus dem Smalltalk-Universum wie CategoriesSprache wird vermutlich nicht mehr weiterentwickelt

virtuallet

virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Objective-C-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.