Objective-C

Objective-C

Aufbauend auf den beiden ersten, ganz einfachen “Hello World’s” möchte ich nun ein wenig näher auf die Programmiersprache Objective-C eingehen. Das Schwergewicht werde ich dabei auf die Punkte legen, die für den Einstieg und das bessere Verständnis unbedingt notwendig sind. Die Notation verwirrt anfangs zwar ein wenig, wer sich jedoch damit beschäftigt und auf die Sprache einlässt, wird schnell merken wie leistungsfähig das Ganze ist. Insbesondere im Zusammenspiel mit dem dahinterstehenden Framework des iPhones: Cocoa Touch.

Wichtigstes Element: Die Klasse

@interface Person : NSObject {
     // Das sind Instanz Variablen
     int alter;  // ... vom Typ int
     NSString* name;  // ...vom Typ NSString (Klasse)
     NSString* vorname;
}
 
// Das sind Messages:
// In Objective-C heissen Methoden Messages
- (void)initialisieren;
- (void)setAlter:(int)alter;
- (void)setPerson:(NSString*)name vorname:(NSString*)vorname;
- (int)getJahrgang;
 
@end
 
@implementation Person
 
- (void)setAlter:(int)alter {
    // Mach irgendetwas ...
}
 
...
 
@end

Darin unterscheidet sich die Sprache noch nicht wesentlich von vielen Anderen, wie z.B. Java oder C#. Wie in C++ trennt man allerdings Klassen in deren Beschreibung (@interface) und deren Implementierung (@implementation).

Universeller Zugriff auf Klassen: id
Der Datentyp id ist eine einfache, aber wichtige Erweiterung in Objective-C. Um Klassen unabhägig vom Typ (Bsp. Person) ansprechen zu können, genügt es diese mit id zu deklarieren. Dies wird insbesondere bei der Kommunikation zwischen Interface Builder und Code (Messaging) intensiv genutzt.

id person = [Person new];

Der Aufruf von Klassen: Messages
Ein wenig ungewohnt sieht das Ganze aus, wenn man eine Nachricht (Message) einer Klasse aufrufen möchte. Obige Klasse wird beispielsweise wie folgt angesprochen:

Person* person = [Person new];
[person initialisieren];

und mit Parametern:

Person* person = [Person new];
[person setAlter:35];
[person setPerson:@"Muster" vorname:@"Peter"];

Vereinfachung durch Properties (@property)
Properties gibt es seit Version 2.0 von Objective-C und erweitern Klassen um die Möglichkeit, einfacher auf Instanz Variablen zuzugreifen. Eine Fähigkeit, die es eigentlich in allen modernen objektorientieren Sprachen gibt. Damit kann der Codeumfang stark reduziert werden, da der Compiler selber das mühsame Schreiben der Getter und Setter Methoden übernimmt:

@interface Person : NSObject {
     int alter;
     NSString* name;
     NSString* vorname;
}
 
@property int alter;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSString* vorname;
 
@end
 
@implementation Person
 
@synthesize alter;
@synthesize name;
@synthesize vorname;

Wobei die Vereinfachung genaugenommen erst beim Aufruf zum Tragen kommt, da nun folgendermassen auf die Instanz Variablen des Objekts zugegriffen werden kann:

Person* person = [Person new];
person.alter = 35;
person.name = @"Muster";
person.vorname = @"Peter";
int jahrgang = 2009-person.alter;

Die sieht natürlich vorallem für Entwickler, die von Java oder C# her kommen, sehr viel gewohnter aus und bietet zudem einige Vorteile bei der Speicherverwaltung. Wer sich noch näher mit Properties beschäftigen möchte, der findet auf den Apple Seiten alles Wichtige dazu, auch was es mit dem Keyword @synthesize und den Attributen nonatomic und retain auf sich hat.

There’s one more thing: IBOutlet und IBAction
Die beiden Keywords IBOutlet und IBAction gehören genaugenommen nicht zu Objective-C und dienen dazu, den Code für den Interface Builder zu markieren. So kann dieser erkennen, welche Message durch welches UI Element (Bsp. Button) aufgerufen werden soll (Action Target Prinzip) und welche Instanz Variable mit welchem UI Element (Bsp. Label) verknüpft wird. Die Anwendung ist dabei ganz einfach:

@interface Person : NSObject {
     UILabel* text;
}
 
// Dieses Textfeld kann in Interface Builder verknüpft werden
@property (nonatomic, retain) IBOutlet UILabel* text;
 
// Diese Message kann von Interface Builder aufgerufen werden
- (IBAction)aendereText:(id)sender;
 
@end

So, das soll es nun aber für den Moment auch schon sein, obwohl die Sprache natürlich noch viel mehr zu bieten hat. Für den Einstieg und erste einfache Programme genügt dies aber bereits udn wir werden dies in den kommenden Screencasts auch intensiv nutzen.
Also, nur Mut! Der Einstieg ist ein wenig ungewohnt, aber man findet sich schnell zurecht und Spass macht es sowieso.

Leave a Reply

You must be logged in to post a comment.