Objective-C
aus Wikipedia, der freien Enzyklopädie
Objective-C, auch kurz ObjC genannt, erweitert die Programmiersprache C um Sprachmittel zur objektorientierten Programmierung. Objective-C++ erlaubt die teilweise Mischung von Objective-C mit C++-Code mit dem Ziel, älteren Code verwenden zu können. Objective-C ist die primäre Sprache von Cocoa (Mac OS X) und GNUstep.
Die Syntax und Konzeption der objektorientierten Erweiterungen ist an Smalltalk angelehnt und von der gewöhnlichen prozeduralen C-Syntax strikt getrennt. Diese Trennung erlaubt es, das gleiche Konzept zur Erweiterung auf andere imperative Sprachen anzuwenden; so gibt es z.B. ebenfalls Objective Pascal.
Inhaltsverzeichnis |
[Bearbeiten] Geschichte
Objective-C wurde hauptsächlich von Brad Cox in den 80er Jahren bei PPI, später Stepstone, entwickelt, später dann von NeXT in die GNU Compiler Collection integriert, um als Basis für NextStep zu dienen.
[Bearbeiten] Wesentliche Eigenschaften
[Bearbeiten] Syntax
Die Syntax von Objective-C erweitert die C-Syntax um objektorientierte Elemente. Diese Syntaxerweiterungen lehnen sich jedoch nicht an die C-Syntax an, wie es etwa viele verbreitete objektorientierte Programmiersprachen tun, sondern an die der Programmiersprache Smalltalk.
[Bearbeiten] Nachrichten
Auch das objektorientierte Konzept von Objective-C unterscheidet sich von dem anderer Programmiersprachen, die auf Simula zurückgehen. Es entspricht dem Konzept von Smalltalk. Nachrichten sind in Objective-C gleichzeitig Instanzobjekte der Klasse NSInvocation
. Anstatt den Methodenaufruf als eine Art an das Objekt gebundene Funktion zu betrachten, ist dieser Mechanismus in Objective-C das Versenden einer Nachricht.
[objekt methode]
sendet also die Nachricht, methode
auszuführen, an das Objekt. Z.B.
stringLaenge = [@"Hallo Welt" length];
Sendet die Nachricht length
an das String-Objekt "Hallo Welt"
, das mit der Länge „antwortet“.
Parameter können jeweils nach einem Doppelpunkt angegeben werden, danach kann der Methodenname weitergehen, zum Beispiel:
[NSColor colorWithCalibratedRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.0];
(Der eigentliche Methodenname wäre dann colorWithCalibratedRed: green: blue: alpha:
.)
Nachrichten können auch verschachtelt werden. Z.B.
NSString*string=@"Hallo Welt"; NSData*data=[NSData dataWithBytes:[string cString] length:[string cStringLength]];
Hiermit wird ein neues Objekt der Klasse NSData erstellt. Die Bytes, die in das neue Objekt kopiert werden, werden mit [string cString] erfragt, die Länge des Blocks mit [string cStringLength].
Es werden also die Rückgabewerte der Methoden verwendet. Dies geht auch beim Empfänger, zum Beispiel entspricht die Methode new diesem Aufruf:
[ [Klasse alloc] init]
Das Objekt, das mit [Klasse alloc] erzeugt wurde, bekommt die Botschaft init.
Kann ein Objekt eine Nachricht nicht verstehen, so kann diese mittels Forwarding an ein anderes Objekt weitergeleitet werden.
Die Nachricht selbst ist nicht statisch wie in C++, sondern kann Gegenstand des Programmes sein. Hierzu gibt es zum einen den Datentypen SEL
zum anderen kann der Selector zur Laufzeit aus einem String gebildet werden. Hierdurch ist es etwa möglich, textuelle Beschreibungen eines Models zur Laufzeit zu laden und zu verwenden.
[Bearbeiten] Klassendefinition
Um seine Eigene Art von Objekten zu erstellen, muss man sie in einer Klasse beschreiben. Dazu werden im @interface
-Teil – gewöhnlich in einer Header-Datei – der Zustand solcher Objekte und ihre Eigenschaften definiert, d.h. ihre Variablen und Methoden. Hier im Beispiel eine Bruch-Klasse.
@interface Bruch:NSObject { int nenner; // Zustandsgrößen, auch Attribute genannt int zaehler; } - (void) printLn; // Fähigkeiten - (void) setNenner: (int)n zaehler: (int)z; - (int) nenner; - (int) zaehler; - (float) float; - init; // Anfangszustand setzen @end
Die @implementation
beschreibt, wie die Fähigkeiten ausgeführt werden:
@implementation Bruch:NSObject - (void) printLn { printf("%i/%i\n",nenner,zaehler); } - (void) setNenner: (int) n zaehler: (int) z { zaehler = z; nenner = n; } - (int) nenner { return nenner; } - (int) zaehler { return zaehler; } - (float) float { return ((float) nenner)/zaehler; } - (id) init { if (self = [super init]) [self setNenner: 1 zaehler:1]; return self; } @end
Ein Objekt kann nun erstellt werden, indem man die Nachricht [Klasse alloc]
sendet¹. Die Bruch-Klasse kann man also folgendermaßen benutzen:
int main(int argc, const char **argv) { id MeinBruch = [[Bruch alloc] init]; [MeinBruch setNenner: 10 zaehler:20]; [MeinBruch printLn]; printf("%f",[MeinBruch float]); [MeinBruch release]; return 0; }
¹ Man sagt auch die Klasse wird „instanziert“, MeinBruch
ist eine Instanz von Bruch
[Bearbeiten] Klassenobjekte
Objective-C besitzt so genannte Klassenobjekte. Dies bedeutet: Nicht nur die Instanzen, sondern auch die Klassen sind Objekte und können Nachrichten empfangen, wie oben [Klasse alloc]
. – Zum Instanzieren sind damit keine zusätzlichen Sprachelemente wie Konstruktoren und Schlüsselwörter nötig.
In der Klassendefinition werden Klassenmethoden mit ‚+
‘, Instanzmethoden mit ‚-
‘ gekennzeichnet.
+alloc
ist von der Sprachsyntax her gesehen eine von vielen möglichen Klassenmethoden und der eigenen Implementierung zugänglich. Die Methode zu überschreiben ist jedoch nur für Experten eine gute Idee. Ganz im Gegensatz ist die Methode +initialize
, die beim Programmstart aufgerufen wird, standardmäßig leer und kann für klassenbezogene Vorauseinstellungen überschrieben werden.
[Bearbeiten] Typkonzept
Objective-C fügt zu den Standard-C-Datentypen den Datentyp id hinzu. Ein Objekt des Types id ist irgendein Objekt. Was mit diesem Objekt angefangen werden kann, wird erst zur Laufzeit bestimmt. Hierzu existieren Methoden, etwas über das Objekt zu erfahren. Wichtig sind:
[obj class]
// bestimmt die Klasse[obj respondsToSelector:]
// bestimmt, ob eine Methode vorhanden ist[obj conformsProtocol:]
// bestimmt, ob ein Protokoll implementiert ist
Das Typkonzept erlaubt zudem die Typisierung des allgemeinen Objektes oder anderer Objekte durch (formale) Protokolle. Diese legen einen Satz von Methoden fest. Auch diese Protokolle müssen nicht in einem Hierarchiebaum einheitlich sein, werden aber vererbt.
Die Typfreiheit erlaubt die Erstellung allgemeiner Container, die anders als templates auch typgemischt sein können.
NSMutableDictionary *meineWelt = [[NSMutableDictionary alloc] init];
// Eine Map mit einem String, einer URL und einem Wert
[meineWelt setObject:@"Ein Text" forKey:@"Text"];
[meineWelt setObject:[NSURL URLWithString:@"www.example.com"] forKey:@"URL"];
[meineWelt setObject:[NSNumber numberWithInt:3] forKey:@"Zahl"];
// Alle Objekte implementiern die Methode description
NSLog( @"%@", [[meineWelt objectForKey:@"Text"] description] );
NSLog( @"%@", [[meineWelt objectForKey:@"URL"] description] );
NSLog( @"%@", [[meineWelt objectForKey:@"Zahl"] description] );
[meineWelt release];
Ausgabe:
Ein Text
www.example.com
3
[Bearbeiten] Spätes Binden (dynamisches Binden)
Objective-C bindet einen Methodenaufruf erst zur Laufzeit an eine Methode. Grundsätzlich ist dies auch in C++ so. Jedoch muss in C++ bereits zur Übersetzungszeit sichergestellt sein, dass eine Methode existiert, weil sie zu der Klassenhierarchie gehört. C++ ist also nur bereit, innerhalb eines Zweiges einer Hierarchie spät zu binden, während Objective-C dies unabhängig von der Stellung einer Klasse in einem Hierarchiebaum macht. Dies soll an einem syntax-neutralen Beispiel verdeutlicht werden:
Klasse A
methode()
Klasse B von Klasse A
methode()
Klasse C
methode()
...
// Spätes Binden in C++
A* objekt = new B;
objekt->methode(); // Ruft in Wahrheit B::methode auf
objekt = new C; // Führt zu Fehlern, da typfremd.
objekt->methode(); // Auch mit casting geht dies nicht, weil methode()
// in einem anderen Zweig des Baumes auftaucht,
// obwohl C::methode() sehr wohl existiert
// Spätes Binden in oC
id objekt = new B; // id bedeutet „Irgend ein Objekt“
objekt->methode(); // Funktioniert, weil B methode() kennt
objekt = new C;
objekt->methode(); // Funktioniert auch, weil C die methode() kennt
// Wo sie in der Klassenhierarchie bekannt ist,
// spielt keinerlei Rolle
Zu diesem Zweck führt Objective-C zur Laufzeit umfangreiche Informationen über ein Objekt mit, was über RTTI hinausgeht.
Aus dem letztlich gleichen Grunde ist es auch ohne weiteres möglich, zur Laufzeit erst eine Methode zu bestimmen. Die Methode kann sich ähnlich wie bei einem Methodenzeiger in einer Variablen befinden, die erst zur Laufzeit mit einem Wert besetzt wird:
SEL methode;
methode = @selector( eineMethode );
[objekt performSelector:methode]; // Ruft die Methode eineMethode auf
methode = @selector( andereMethode );
[objekt performSelector:methode]; // Ruft andereMethode auf
Von dieser Technik macht etwa Cocoa bei der Bindung von Interface-Elementen an Methoden regen Gebrauch. Die Bestimmung der Methode kann auch durch ihren Klarnamen erfolgen.
[Bearbeiten] Programmbeispiel
id *aDictionary = [[NSMutableDictionary alloc] init];
[aDictionary setObject:@"eier" forKey:@"egg"];
[aDictionary setObject:@"auto" forKey:@"car"];
[aDictionary setObject:@"Hallo Welt!" forKey:@"Hello, world!"];
NSLog([aDictionary objectForKey:@"Hello, world!"]);
[aDictionary release];
[Bearbeiten] Literatur
- Object-Oriented Programming : an evolutionary approach, Brad J. Cox and Andrew J. Novobilski, Addison-Wesley, 1986, 1991 (2nd Edition), ISBN 0-201-54834-8, 270 Seiten. Einführung vom Autor dieser Sprache.
- Object-Oriented Programming and the Objective C Language, NeXTSTEP Developers Library Release 3, Addison-Wesley, 1993, ISBN 0-201-63251-9, 240 Seiten
- Objective-C und Cocoa, Programmieren unter Apple Mac OS X, Klaus M. Rodewig, Amin Negm-Awad, Smartbooks, 2. überarbeitete und stark erweiterte Ausgabe mit 927 Seiten, Erscheinungsdatum: 2. Januar 2007, 1. Auflage, ISBN 9783908497424
- Programming in Objective-C, Stephen Kochan, Sams, 2003, Englisch, ISBN 0672325861
- Cocoa Programming for Mac OS X, 2nd Edition, Aaron Hillegass, Addison-Wesley Professional, 2004, Englisch, ISBN 0321213149
[Bearbeiten] Weblinks
- A 10-Minute Introduction to Objective-C
- Einführung in Objective-C
- Introduction to The Objective-C Programming Language (Apple Developer Connection)
- Object-Oriented Programming and The Objective-C Language
- Object Oriented Programming in Objective-C
- Objective-C FAQ
- Objective-C: Links, Resources, Stuff
- [1]
- Links zu den OpenStep-Implementationen GNUstep und Cocoa
Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf bitte mit ihn zu verbessern und entferne anschließend diese Markierung. |