Open Source im professionellen Einsatz

© photocase.com

Objective-C und Gnustep

Step by Step

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".

Ü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.

Listing 1:
»Ellipse.h«

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.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook