====== Objective-C ====== //Objective-C// ist eine [[lexikon:oop|Objekt-orientierte Programmiersprache]] die fast ausschließlich von Apple für ihre Betriebssysteme [[macosx:development|MacOS X]] und [[ios:development|iOS]] und deren Programme verwendet wird. Sie basiert auf der Programmiersprachen [[c:start|C]] und erweitert sie um die [[lexikon:oop|Objekt-orientierung]], die stark an die Programmiersprache [[smalltalk:start|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 [[apple:foundation:start|Foundation]] und [[apple:cocoa:start|Cocoa]] bzw. [[apple:cocoa-touch:start|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 ===== #import int main(void) { printf("Hello World!\n"); return 0; } [[https://github.com/akamola/helloworld/blob/master/helloworld.m|"Hello World"-Beispiel auf GitHub]] ==== Hello World mit OOP ==== Ein Beispiel mit [[lexikon:oop|Objekt-Orientierung]]: Folgendes Beispiel ist für den [[gcc:start|GCC]] ausgelegt, um dieses Programm etwa mit [[xcode:start|Xcode]] compilieren zu können sind ein paar kleine Änderungen nötig. Problemlos lässt sich aber das [[c:start#hello_world|C-"Hello World"-Programm]] mit einem Objective-C-Compilier compilieren. #import #import @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:start|clang]]'' compilieren: clang foobar.m -o foobar -framework Foundation Statt mit ''clang'' lassen sich Objective-C-Dateien auch mit [[gcc:start|GCC]] compilieren: gcc foobar.m -o foobar -framework Foundation ===== Konstanten ===== Konstanten werden, wie in [[c:start|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 [[apple:foundation:start|Foundation-Framework]] verwendet wird, dann sollten lieber [[apple:foundation:start#konstanten|statische Eigenschaften]] statt Konstanten mit ''#define'' verwendet werden. Quelle: [[http://stackoverflow.com/a/17228508|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 [[lexikon:compiler#directives|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 [[lexikon:oop|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: #import @protocol FooBarDelegate; @interface FooBar: UIViewController // Delegate property of the class @property (nonatomic, weak) id delegate; @end // Delegate @protocol FooBarDelegate @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 Quelle: [[http://www.idev101.com/code/Objective-C/delegate.html|iPhone Development 101: Objective-C: Delegate Protocols]] ===== Links ===== * [[https://pinboard.in/u:aberaberarne/t:objc|Arnes Link-Sammlung zu Objectice-C]] ==== Tutorials ==== * [[https://www.codeschool.com/courses/try-objective-c|Code School: Try Objective-C]]\\ Kostenlos nach Registrierung bei //Code School// === Kostenpflichtige Tutorials === * [[https://www.video2brain.com/de/videotraining/objective-c-3-0-das-grosse-training|video2brain: Objective-C 3.0 – Das große Training]]