© photocase.com
Objective-C und Gnustep
Step by Step
von Oliver Frommel
Erschienen im Linux-Magazin
2006/03
Mit seiner über 20-jährigen Geschichte gehört Objective-C zwar zu den alten Hasen im Programmiergeschäft. Doch im Gespann mit Gnustep schafft es noch immer neue GUI-Anwendungen.
Bei großen Softwareprojekten hilft der objektorientierte Ansatz umfangreiche Mengen Code sinnvoll zu unterteilen. Zum Programmieren grafischer Schnittstellen eignet sich die Technik besonders gut, daher kommt kaum ein Fenstersystem ohne sie aus. Stellt sich nur noch die Frage nach der passenden Programmiersprache. Heute sind das oft Java, das so mancher Programmierer immer noch zu langsam findet, oder C++, das vielen zu komplex ist. Objective-C [1] ist eine Alternative zu den beiden Stars, die sich in vielen Projekten bewährt hat, etwa bei Open Groupware [2].
Objective-C erweitert C um eine objektorientierte Syntax, ist gleichzeitig aber weniger komplex als C++. Syntaktisch orientiert es sich an Smalltalk in sei-ner Schreibweise von Objekten als Nachrichtenempfänger: »[ Objekt Nachricht]«. Objective-C bietet ein dynamisches Typsystem, kann also zur Laufzeit auf Objekte unterschiedlichen Typs passend reagieren.
Die Entstehung
Die Wurzeln von Objective-C liegen in den Next-Computern und ihrem Betriebssystem Nextstep, das sich dieser Sprache bediente [3]. Daraus wurde die freie API-Spezifikation Openstep, die wiederum als Basis für Mac OS X diente, als Apple die Rechte an Nextstep erwarb. So ist die am weitesten verbreitete Progammiersprache für den Mac immer noch Objective-C, obwohl aktuelle Versionen des Apple-GCC auch die Mischung mit C++ erlauben. Die als Objective-C++ bekannte Sprachvariante wird in Version 4.1 der GCC-Mainline erwartet.
Ein Linux-System implementiert Objective-C zweistufig: einerseits als GCC-Compiler-Komponente, die objektorientierte Konstrukte in gewöhnlichen C-Code übersetzt (zumindest theoretisch, praktisch benutzt der GNU-Compiler keine C-Zwischenstufe), andererseits als Runtime-System, das Nachrichten zustellt und sich um die Speicherverwaltung kümmert. In Objective-C geschriebene Programme müssen mindestens den Header »objc/Object.h« einbinden und mit »-lobjc« linken. Mehr darüber, wie man Objective-C-Programme kompiliert, verrät der Kasten "Übersetzen".
|
Wer mit Objective-C programmieren möchte, braucht natürlich einen Compiler, der die Sprache beherrscht. Der GNU-Compiler kann das schon lange, die Sprachunterstützung wird sogar immer noch ausgebaut und verbessert. Das passende Installationspaket findet sich in praktisch jeder Distribution unter dem Namen »gcc-objc« oder einem ähnlichen. Die zugehörige Library befindet sich häufig in einem extra Paket »libobjc«. Die Übersetzung gestaltet sich ähnlich wie bei C, die Objective-C-Quelldateien tragen aber per Konvention die Endung ».m«:
cc -c Ellipse.m Circle.m Geo.m
cc -o Geo Geo.o Circle.o Ellipse.o -lobjc
Diese beiden Zeilen erzeugen aus ihnen zunächst Objektdateien und linken sie und die Libobjc anschließend zu einem ausführbaren Programm namens »Geo«.
|
Headerdateien enthalten üblicherweise die Definition der Klassen. Das Schlüsselwort dafür lautet in Objective-C »@interface«. Danach folgen der Name der Klasse, die Elternklasse und eventuell weitere Modifikatoren, die die Vererbung bestimmen. Die Deklaration endet mit »@end«. Eine Klasse »MyObject«, die von »Object« abgeleitet ist, beginnt so:
@interface MyObject: Object
Dann folgen in geschweiften Klammern die Instanzvariablen. Gibt es keine, bleibt dieser Teil einfach leer. Schließlich folgen die Methoden, einmal die mit einem »+« gekennzeichneten Klassenmethoden, zum zweiten die mit »-« markierten Instanzmethoden. Die Typen der Rückgabewerte stehen in Klammern vor dem Methodennamen, dahinter die optionalen Argumente, mit Schlüsselwörtern und Doppelpunkten getrennt:
+ (id) init;
- (void) setRadius: (int) r;
- (void) draw;
Der Typ »id« kann in Objective-C beliebige Objekte aufnehmen, unterstützt also das dynamische Typsystem.
Nachrichten verschicken
Das Hauptprogramm ruft Methoden des Objekts über den erwähnten Message-Mechanismus auf, wobei es für Argumente die Notation mit den Doppelpunkten benutzt: »[circle setRadius: 3]«. Listing 1 zeigt einen kompletten Header mit den beiden Instanzvariablen »r1« und »r2« sowie der Klassenmethode »init« und mehreren Instanzmethoden.
01 #import <objc/Object.h>
02
03 @interface Ellipse: Object
04 {
05 float r1, r2;
06 }
07 + (id) init;
08 - (void) setR1: (float)r;
09 - (void) setR2: (float)r;
10 - (void) setAchse1: (float)a Achse2: (float)b;
11 - (void) printDim;
12 - (float) area;
13 - (float) r1;
14 - (float) r2;
15 @end
|
Um von der Klassendeklaration Gebrauch zu machen, bindet der Programmierer den Header in seine anderen Dateien ein. Dazu kann er wie in C »#include« benutzen, muss allerdings mit den bekannten »#ifndef«-Konstrukten verhindern, dass Header mehrfach eingebunden werden. Objective-C bietet stattdessen »#import«, das genau dies erledigt, also einiges an Schreibarbeit spart. Listing 1 bindet so den Haupt-Header von Objective-C ein, der zum Beispiel die Definition von »Object« enthält, von dem »Ellipse« grundlegende Eigenschaften erbt.
| Whitepaper |
|
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele (Folge 2)
Der zweite Teil des Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele White Papers beleuchtet anhand weiterer ausgewählter Case Studies die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.
Download PDF (Registrierung erforderlich)
|
|
Usage Landscape Enterprise Open Source Data Integration
Die Nachfrage nach Datenintegrationslösungen für Unternehmen ist zunehmend gestiegen und vor allem das Interesse an Open Source Technologien wird immer größer. Doch wie und von wem werden Open Source Datenintegrationslösungen genutzt und welches Nutzungsverhalten lässt sich daraus ableiten? Das vorliegende White Paper präsentiert die Erfahrungswerte von über 1000 Open Source Nutzern und liefert fundierte Antworten auf diese Fragen.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|