objc:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| objc:start [2015-02-28 07:25] – Methoden-Varianten ausführlicher beschrieben a.kamola | objc:start [2015-03-09 19:27] (aktuell) – [Hello World] Link zu GitHub a.kamola | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Objective-C ====== | ====== Objective-C ====== | ||
| + | |||
| + | // | ||
| + | |||
| + | 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 // | ||
| + | |||
| + | Da Objective-C fast ausschließlich von Apple verwendet wird ist die Sprache fast untrennbar von Apples Frameworks [[apple: | ||
| + | |||
| + | ===== Hello World ===== | ||
| + | |||
| + | <code objc helloworld.m> | ||
| + | #import < | ||
| + | |||
| + | int main(void) { | ||
| + | printf(" | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | ==== Hello World mit OOP ==== | ||
| + | |||
| + | Ein Beispiel mit [[lexikon: | ||
| + | |||
| + | <code objc helloworld.m> | ||
| + | #import < | ||
| + | #import < | ||
| + | |||
| + | @interface Hello | ||
| + | - (void) init; | ||
| + | - (void) say; | ||
| + | @end | ||
| + | |||
| + | @implementation Hello | ||
| + | - (void) init { | ||
| + | [super init]; | ||
| + | } | ||
| + | |||
| + | - (void) say { | ||
| + | printf(" | ||
| + | } | ||
| + | @end | ||
| + | |||
| + | int main() { | ||
| + | Hello *hello = [Hello new]; | ||
| + | |||
| + | [hello say]; | ||
| + | [hello free]; | ||
| + | |||
| + | retrun 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Dateien ===== | ||
| + | |||
| + | ^ Datei-Endung ^ Beschreibung ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | In Dateien mit der Endung '' | ||
| + | |||
| + | ===== Compilieren ===== | ||
| + | |||
| + | Auf der Konsole lassen sich Objective-C-Dateien am einfachsten mit '' | ||
| + | |||
| + | <code bash> | ||
| + | clang foobar.m -o foobar -framework Foundation | ||
| + | </ | ||
| + | |||
| + | Statt mit '' | ||
| + | |||
| + | <code bash> | ||
| + | gcc foobar.m -o foobar -framework Foundation | ||
| + | </ | ||
| + | |||
| + | ===== Konstanten ===== | ||
| + | |||
| + | Konstanten werden, wie in [[c: | ||
| + | |||
| + | Dieses Beispiel definiert eine Konstante '' | ||
| + | |||
| + | <code objc> | ||
| + | #define FOOBAR 23 | ||
| + | </ | ||
| + | |||
| + | Wenn Objective-C – wie in der Regel üblich – mit dem [[apple: | ||
| + | |||
| + | Quelle: [[http:// | ||
| + | |||
| + | ===== Typen ===== | ||
| + | |||
| + | ^ Typ ^ Erklärung ^ Erlaubte Werte ^ | ||
| + | | '' | ||
| + | |||
| + | ===== Code-Blöcke ===== | ||
| + | |||
| + | Code-Abschnitte lassen sich in Blöcke kapseln und durch Zuweisung zu einer Variable (hier '' | ||
| + | |||
| + | <code objc> | ||
| + | void (^foobar)(void) = ^{ | ||
| + | // Code | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Aufruf des Code-Blocks: | ||
| + | |||
| + | <code objc> | ||
| + | foobar(); | ||
| + | </ | ||
| + | |||
| + | ===== Klassen ===== | ||
| + | |||
| + | ==== Einbinden von Dateien ==== | ||
| + | |||
| + | Dateien werden in Objective-C üblicherweise mit der [[lexikon: | ||
| ===== Methoden ===== | ===== Methoden ===== | ||
| Zeile 36: | Zeile 152: | ||
| [foobar barInstanceMethod]; | [foobar barInstanceMethod]; | ||
| </ | </ | ||
| + | |||
| + | ==== Objekte auf Methoden überprüfen ==== | ||
| + | |||
| + | Zur Verhinderung von Laufzeitfehlern, | ||
| + | |||
| + | <code objc> | ||
| + | if([foobar respondsToSelector: | ||
| + | // Code, if the method exists on the object | ||
| + | } else { | ||
| + | // Alternate code, if the method doesn' | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Delegates ===== | ||
| + | |||
| + | ==== Eigenen Delegate definieren ==== | ||
| + | |||
| + | Delegates werden über ein Protokoll in der Header-Datei einer Klasse definiert: | ||
| + | |||
| + | <code objc FooBar.h> | ||
| + | #import < | ||
| + | |||
| + | @protocol FooBarDelegate; | ||
| + | |||
| + | @interface FooBar: UIViewController | ||
| + | |||
| + | // Delegate property of the class | ||
| + | @property (nonatomic, weak) id< | ||
| + | |||
| + | @end | ||
| + | |||
| + | // Delegate | ||
| + | |||
| + | @protocol FooBarDelegate < | ||
| + | |||
| + | @required | ||
| + | -(void)requiredDelegateMethod; | ||
| + | |||
| + | @optional | ||
| + | -(void)optionalDelegateMethodOne; | ||
| + | -(void)optionalDelegateMethodTwo: | ||
| + | |||
| + | @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: | ||
| + | |||
| + | <code objc> | ||
| + | if (self.delegate && [self.delegate respondsToSelector: | ||
| + | [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: | ||
| + | |||
| + | <code objc> | ||
| + | #import " | ||
| + | |||
| + | @interface FooViewController : UIViewController < | ||
| + | </ | ||
| + | |||
| + | Quelle: [[http:// | ||
| ===== Links ===== | ===== Links ===== | ||
objc/start.1425104736.txt.gz · Zuletzt geändert: 2015-02-28 07:25 von a.kamola