
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
Name | Objective-C |
Webseite | https://developer.apple.com |
Erscheinungsjahr | 1984 |
Aktuellste Version (Stand 8. Oktober 2023) | Version 2.0 aus dem Jahr 2006 |
Typisierung | statisch |
Paradigmen | objektorientiert, aspektorientiert |
Pros | Cons |
---|---|
relativ schnell, geringer Speicherbedarf und kleine Kompilate | sehr verbose Syntax |
automatische Speicherbereinigung mit ARC | komplizierte Sprache, auch weil C-kompatibel und die Syntax von Objective-C sich von C sehr unterscheidet |
Obermenge von C, Zugriff auf das C-Ökosystem | höherer Einarbeitungsaufwand für Umsteiger aus C-ähnlichen Sprachen als bei vergleichbaren Sprachen |
gereifte Sprache, große Community | plattformspezifisch |
interessante Sprachkonstrukte aus dem Smalltalk-Universum wie Categories | Sprache 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.