Nachdem Ihr erstes Programm jetzt hoffentlich fehlerfrei funktioniert, sollten Sie sich etwas Zeit nehmen, um dem Geheimnis der Bezeichner IBAction und IBOutlet auf die Spur zu kommen. Das sind nämlich keine Anweisungen der Sprache Objective-C, sondern etwas ganz anderes. Die Buchstaben IB lassen schnell darauf schliessen, dass diese beiden Bezeichner irgendetwas mit dem Interface Builder zu tun haben und Sie wissen inzwischen, dass es tatsächlich genau so ist. Der Interface Builder kann IBAction und IBOutlet in den Headerdateien erkennen und auswerten. Es sind nur diese beiden Typen, die für Ihn interessant sind. Sollten im Header noch andere Methoden oder Instanzvariablen deklariert sein, werden diese vom Interface Builder ignoriert. Was verbirgt sich aber hinter diesen Schlüsselwörtern? Die Antwort mag überraschen: Nicht viel. Sowohl IBAction als auch IBOutlet sind nur zur Entwicklungszeit wichtig und haben in einem kompilierten Programm keine Auswirkungen mehr. Das kann man sogar sehr eindrucksvoll beweisen. Klicken Sie mit der sekundären Maustaste auf das Wort IBAction in der MyController.h Datei. Wählen Sie anschließend Jump to Definition aus dem Kontextmenü, und die Datei NSNibDeclarations.h wird geöffnet. Markiert ist folgende Zeile.
#define IBAction void
Das Wort #define ist eine so genannte Präprozessor-Direktive. Darunter versteht man spezielle Anweisungen, mit denen man den Compiler dazu bringen kann, bestimmte Aufgaben auszuführen, und zwar bevor der Programmcode in Maschinensprache umgesetzt wird. #define ist dabei eine der einfachsten Anweisung, denn hierbei handelt es sich nur um eine Textersetzung. In diesem konkreten Fall wird von dem Compiler das Wort IBAction im gesamten Projekt durch void ersetzt. Das englische Wort void bedeutet so viel wie leer oder ungültig, soll aber in diesem Zusammenhang ausdrücken, dass die Methode clickMe keinen Rückgabewert hat. Aus der Methodendeklaration
- (IBAction)clearMe:(id)sender;
wird also noch vor der Kompilierung
- (IBAction)clearMe:(id)sender;
Es ist auch nachvollziehbar, dass diese Methode keinen Rückgabewert hat. Da sie durch ein Objekt der grafischen Benutzeroberfläche aufgerufen wird, gibt es auch nichts, was einen Rückgabewert entgegennehmen könnte. Da es sich also bei Methoden, die mit IBAction deklariert sind, um ganz normale Methoden handelt, können diese selbstverständlich auch vom Programmcode aufgerufen werden. Es wird funktionieren, ist aber nicht unbedingt ein Zeichen für gutes Design, wenn es wirklich in dieser Form nötig sein sollte. Kehren Sie in die MyController.h zurück und springen Sie anschließend auf dem gleichen Weg zur Definition von IBOutlet
- (IBAction)clearMe:(id)sender;
Auf den ersten Blick könnte man meinen, hier würde etwas fehlen, aber diese Textersetzung ist vollständig. IBOutlet wird ganz einfach durch nichts ersetzt. Es wird entfernt. Sie sehen also, dass sich hinter IBOutlet und IBAction keineswegs irgendwelche geheimnisvollen Befehle verbergen. Es sind lediglich Hilfen für den Interface Builder, um die richtigen Anschlüsse zu finden, und für den Entwickler eine kleine Hilfe, die Lesbarkeit des Code zu verbessern. Auf den Programmcode an sich haben sie aber keinen Einfluss.
Geschrieben am: 20.03.2007 Technologien: Xcode, Objective-C, OS X