Benutzer-Werkzeuge

Webseiten-Werkzeuge


objc:start

Objective-C

Objective-C ist eine Objekt-orientierte Programmiersprache die fast ausschließlich von Apple für ihre Betriebssysteme MacOS X und iOS und deren Programme verwendet wird. Sie basiert auf der Programmiersprachen C und erweitert sie um die Objekt-orientierung, die stark an die Programmiersprache Smalltalk angelehnt ist.

Objective-C ist dabei eine Erweiterung von C um Objekt-Orientierung (weshalb sich auch reine C-Programme problemlos mit einem Objective-C-Compiler übersetzen lassen). Deshalb spricht man bei Objective-C auch von einer C-Ebene und einer Objective-C-Ebene: Zur C-Ebene gehören alle Sprach-Bestandteile (Grammatik, Typen, etc.) von C; zur Objective-C-Ebene gehören alle Erweiterungen, die nicht zu C gehören.

Da Objective-C fast ausschließlich von Apple verwendet wird ist die Sprache fast untrennbar von Apples Frameworks Foundation und Cocoa bzw. Cocoa Touch. Die Namen „Objective-C“, „Foundation“ und „Cocoa“ werden deshalb oft (wegen einer fehlenden klaren Trennung) synonym verwendet.
Wir versuchen aber die Dinge in diesem Wiki – nach bestem Wissen – klarer zu trennen.

Hello World

helloworld.m
#import <stdio.h>
 
int main(void) {
	printf("Hello World!\n");
 
	return 0;
}

"Hello World"-Beispiel auf GitHub

Hello World mit OOP

Ein Beispiel mit Objekt-Orientierung: Folgendes Beispiel ist für den GCC ausgelegt, um dieses Programm etwa mit Xcode compilieren zu können sind ein paar kleine Änderungen nötig. Problemlos lässt sich aber das C-"Hello World"-Programm mit einem Objective-C-Compilier compilieren.

helloworld.m
#import <stdio.h>
#import <objc/Object.h>
 
@interface Hello
- (void) init;
- (void) say;
@end
 
@implementation Hello
- (void) init {
	[super init];
}
 
- (void) say {
	printf("Hello World!\n");
}
@end
 
int main() {
	Hello *hello = [Hello new];
 
	[hello say];
	[hello free];
 
	retrun 0;
}

Dateien

Datei-Endung Beschreibung
.h Header-Datei mit öffentlichen Klassen-, Typen-, Funktions- und Konstanten-Definitionen
.m Quellcode-Datei mit Objective-C- oder C-Code
.mm Quellcode-Datei mit Objective-C, C- oder C++-Code

In Dateien mit der Endung .mm wird üblicherweise kein C-Code, sondern nur Objective-C- mit C++-Code verwendet!)

Compilieren

Auf der Konsole lassen sich Objective-C-Dateien am einfachsten mit clang compilieren:

clang foobar.m -o foobar -framework Foundation

Statt mit clang lassen sich Objective-C-Dateien auch mit GCC compilieren:

gcc foobar.m -o foobar -framework Foundation

Konstanten

Konstanten werden, wie in C, über die Compiler-Direktive #define am Anfang einer Datei definiert.

Dieses Beispiel definiert eine Konstante FOOBAR mit dem Zahlen-Wert 23:

#define FOOBAR 23

Wenn Objective-C – wie in der Regel üblich – mit dem Foundation-Framework verwendet wird, dann sollten lieber statische Eigenschaften statt Konstanten mit #define verwendet werden.

Quelle: Stack Overflow: What is the best way to create constants in Objective-C?

Typen

Typ Erklärung Erlaubte Werte
BOOL Wahrheitswerte („boolean“) YES, NO

Code-Blöcke

Code-Abschnitte lassen sich in Blöcke kapseln und durch Zuweisung zu einer Variable (hier foobar) wiederverwenden:

void (^foobar)(void) = ^{
	// Code
}

Aufruf des Code-Blocks:

foobar();

Klassen

Einbinden von Dateien

Dateien werden in Objective-C üblicherweise mit der Compiler-Direktive #import eingebunden. Diese ist ähnlich zur, in C üblichen, Direktive #include (die in Objective-C immer noch verwendet werden kann), aber sie stellt darüberhinaus sicher, dass eine Datei immer nur einmal eingebunden wird.

Methoden

Klassen-Methoden

Klassen-Methoden sind Methoden einer Klasse, die verwendet werden können, ohne das ein Objekt erzeugt werden muss. In anderen Objekt-orientierten Programmiersprachen werden diese Methoden auch statische Methoden genannt.

Klassen-Methoden sind in Objective-C an einem + zu Beginn der Signatur zu erkennen:

+ (void)fooClassMethod;

Die Klassen-Methode kann nun in anderen Klassen wie folgt direkt verwendet werden:

[FooBar fooClassMethod];

Instanz-Methoden

Instanz-Methoden sind die Methoden einer Klasse, die nur verwendet werden können, wenn aus einer Klasse ein Objekt erzeugt wurde. Daher sagt man auch umgangssprachlich „eine (Instanz-)Methode wird auf ein Objekt angewendet“.

Instanz-Methoden sind in Objective-C an einem - zu Beginn der Signatur zu erkennen:

- (void)barInstanceMethod;

Instanz-Methoden können in anderen Klassen erst verwendet werden, wenn vorher ein Objekt mit der Klasse erzeugt wurde:

FooBar *foobar = [[FooBar alloc] init];
 
[foobar barInstanceMethod];

Objekte auf Methoden überprüfen

Zur Verhinderung von Laufzeitfehlern, kann man Objekte darauf testen, ob sie über eine bestimmte Methode verfügen:

if([foobar respondsToSelector:@selector(methodName:)]) {
	// Code, if the method exists on the object
} else {
	// Alternate code, if the method doesn't exist on the object
}

Delegates

Eigenen Delegate definieren

Delegates werden über ein Protokoll in der Header-Datei einer Klasse definiert:

FooBar.h
#import <UIKit/UIKit.h>
 
@protocol FooBarDelegate;
 
@interface FooBar: UIViewController
 
// Delegate property of the class
@property (nonatomic, weak) id<FooBarDelegate> delegate;
 
@end
 
// Delegate
 
@protocol FooBarDelegate <NSObject>
 
@required
-(void)requiredDelegateMethod;
 
@optional
-(void)optionalDelegateMethodOne;
-(void)optionalDelegateMethodTwo:(NSString *)withArgument;
 
@end

In der Implementierung kann immer auf die Delegate-Methode verwiesen werden, wobei mit folgender Abfrage sichergestellt werden sollte, dass die Delegate-Methode auch vorhanden ist:

if (self.delegate && [self.delegate respondsToSelector:@selector(optionalDelegateMethodOne)]) {
	[self.delegate optionalDelegateMethodOne];
}

Um den Delegate in einer anderen Klasse zu verwenden muss nun einfach die Header-Datei der Klasse mit dem Delegate importiert und der Delegate im Interface definiert werden:

#import "FooBar.h" // Import the class with delegate to use it
 
@interface FooViewController : UIViewController <FooBarDelegate> 

Quelle: iPhone Development 101: Objective-C: Delegate Protocols

Tutorials

Kostenpflichtige Tutorials

objc/start.txt · Zuletzt geändert: 2015-03-09 19:27 von a.kamola