Objective-C Kurz gesagt Hallo Objective-C

Dieses Kapitel soll Ihnen helfen, sich mit dem Programmierstil Objective-C vertraut zu machen. Am Ende dieses Kapitels können Sie Objekte instanziieren, Methoden erstellen und aufrufen und Eigenschaften deklarieren. Denken Sie daran, dass das Ziel darin besteht, einen kurzen Überblick über die wichtigsten objektorientierten Aspekte von Objective-C zu geben und keine detaillierte Beschreibung der einzelnen Komponenten. In späteren Kapiteln werden viele konzeptionelle Details aufgeführt, die in diesem Kapitel weggelassen wurden.


Klasse erstellen

Enthaltenes Codebeispiel: HelloObjectiveC With Class

Tauchen Sie ein und erstellen Sie eine neue Objective-C-Datei. Navigieren Sie in der Xcode-IDE zu Datei > Neu > Datei… oder benutze die Cmd + N Verknüpfung zum Hinzufügen einer Datei zu Ihrem Projekt. Im nächsten Dialogfeld können Sie auswählen, welche Art von Datei Sie erstellen möchten. Unter dem Kakao-Touch Kategorie auswählen Ziel-C-Klasse.

Das Objective-C-Klassensymbol

Sie haben die Möglichkeit, einen Namen für Ihre neue Klasse anzugeben. Rufen wir unsere Klasse an Person. Verwenden Sie für die übergeordnete Klasse NSObject, Dies ist das Objekt der obersten Ebene, von dem alle Objective-C-Klassen erben.

Neue Personenklasse definieren

Klicken Sie auf Nächster öffnet einen Dateibrowser und fordert Sie zur Eingabe eines Gruppe für Ihre Klasse sowie eine Ziel. Verwenden Sie die Standardeinstellung Gruppe, was sollte sein HalloObjektivC. Gruppen sind ein Xcode-spezifischer Mechanismus zum Gruppieren ähnlicher Dateien, aber sie sind nicht auf Dateiebene implementiert. Unsere neue Klasse wird in demselben Ordner wie die restlichen Projektdateien angezeigt, unabhängig von der Gruppe, in der sie sich befindet. Für Ziele, Stelle sicher HalloObjektivC ist ausgewählt. Dadurch wird sichergestellt, dass die neue Klasse immer dann kompiliert wird, wenn das HelloObjectiveC-Ziel erstellt wird.

Build-Ziele für die neue Klasse auswählen

Klicken Sie abschließend auf Erstellen die Klasse erstellen. Im Xcode-Datei-Navigator sollten Sie jetzt zwei neue Klassen finden: Person.h und Person.m. Genau wie die Programmiersprache C verwendet Objective-C .h Als Erweiterung für Header-Dateien, die die Schnittstelle für eine bestimmte Funktion oder Klasse enthalten, ist dies nicht mit einer C # -Schnittstelle zu verwechseln, die als a bezeichnet wird Protokoll in Ziel-C. Das .m Datei ist die entsprechende Implementierung für die Person Klasse.

Durch das Trennen der Schnittstelle einer Klasse von ihrer Implementierung können Implementierungsdetails vor Objekten von Drittanbietern ausgeblendet werden. Andere Dateien, die mit der Klasse interagieren müssen, importieren die Header file-never die Implementierung Datei. Dies stellt die abstrakte Definition bereit, die zum Aufrufen von Methoden und Zugriffseigenschaften erforderlich ist, wobei sie völlig unabhängig von der Implementierung der Klasse ist.


Komponenten einer Klasse

Wählen Sie im Projektnavigator Person.h um es im Editorfenster zu öffnen. Der folgende Objective-C-Code sollte angezeigt werden:

#einführen  @Interface Person: NSObject @end

Das #einführen Direktive enthält eine andere Datei im aktuellen Kontext. Durch das Einfügen einer Header-Datei haben wir Zugriff auf alle definierten Klassen und Funktionen. In diesem Fall haben wir das Foundation-Framework aufgenommen. Das Fundament-Framework definiert die grundlegenden Konstrukte der Objective-C-Sprachen wie Strings, Arrays, Wörterbücher usw. - es ist also ein notwendiger Bestandteil praktisch jedes Objective-C-Programms.

Das @Schnittstelle Direktive beginnt eine Schnittstelle für eine Klasse. Als nächstes kommt der Klassenname, Person, gefolgt von einem Doppelpunkt und der übergeordneten Klasse, NSObject. Wie bereits erwähnt, NSObject ist das oberste Objekt in Objective-C. Es enthält die erforderlichen Methoden zum Erstellen und Löschen von Instanzen sowie einige andere nützliche Funktionen, die von allen Objekten gemeinsam genutzt werden.

Alle Methoden oder Eigenschaften werden vor dem deklariert @Ende Direktive, aber jetzt, Person.h ist eine leere Schnittstelle. Wir werden das in einer Minute ändern, aber werfen wir zunächst einen Blick auf die Implementierungsdatei, Person.m:

#import "Person.h" @implementation Person @end

Das sieht der Header-Datei sehr ähnlich, enthält jedoch die Person.h Header. Implementierungsdateien Muss Fügen Sie den zugehörigen Header hinzu, sonst können sie die Klasse nicht finden, die sie implementieren möchten.

Beachten Sie auch das #einführen Direktive verwendet Anführungszeichen anstelle von spitzen Klammern. Für den Import sollten Anführungszeichen verwendet werden lokal Header, während Klammern angeben global Überschriften Globale Header befinden sich außerhalb des Projekts und werden während des Erstellungsprozesses mit dem Compiler verknüpft. Apples Standard-Frameworks sind immer in spitzen Klammern enthalten, wohingegen Ihre Projektdateien mit Anführungszeichen importiert werden sollten.

Und natürlich die .m Datei verwendet die @Implementierung Direktive statt @Schnittstelle. Beachten Sie, dass Sie nicht Hier muss die übergeordnete Klasse angegeben werden, da diese Informationen bereits im Header enthalten sind.


Methoden definieren

Als Nächstes fügen wir der Method eine Methodendeklaration hinzu Person Klasse. Denken Sie daran, dass dies ein zweistufiger Prozess ist: Zuerst müssen wir ihn zur Schnittstelle hinzufügen und dann die Implementierung. Also ändern Person.h Zu dem Folgendem:

#einführen  @Interface Person: NSObject - (void) sayHello; @Ende

Wie Sie sehen, werden Instanzmethoden mit einem Bindestrich deklariert, der Rückgabetyp in Klammern (Leere), gefolgt von dem Methodennamen und einem Semikolon. Nun, da wir das in der Schnittstelle haben, wechseln Sie zu Person.m um die Implementierung zu definieren. Beachten Sie, dass Xcode ein kleines gelbes Dreieck neben dem hinzugefügt hat @Implementierung Linie. Wenn Sie darauf klicken, wird eine Warnmeldung angezeigt Unvollständige Implementierung. Dies ist eine der zahlreichen Debugging-Funktionen von Xcode. Beheben Sie das Problem, indem Sie es ändern Person.m Zu dem Folgendem:

#import "Person.h" @implementation Person - (void) sayHello NSLog (@ "Hallo, mein Name ist HAL.");  @Ende

Wie bei der Schnittstellendeklaration beginnt die Implementierung für eine Instanzmethode mit einem Bindestrich, dem Rückgabetyp und dem Funktionsnamen. Die Implementierung selbst wird wie eine C # -Methode in geschweiften Klammern hinter dem Methodennamen definiert. Zum sag Hallo, Wir geben einfach eine Nachricht an die Konsole aus NSLog ().

Während der Eingabe bietet Xcode einige Optionen für die automatische Vervollständigung und sollte Ihre geschweiften Klammern für Sie geschlossen haben. Diese Verhalten können durch Navigieren zu geändert werden Xcode > Einstellungen… in der Menüleiste und klicken Sie auf die Textbearbeitung Symbol.


Objekte instantiieren

Versuchen wir, unser zu instanziieren Person klasse und ruf unser neues an sag Hallo Methode. Denken Sie daran, wie jedes C-Programm, Main() ist der Einstiegspunkt in unsere HalloObjektivC Anwendung. Also wieder rein main.m, Veränderung NSLog (@ "Hallo, Welt!"); Zu dem Folgendem:

#einführen  #import "Person.h" int main (int argc, const char * argv []) @autoreleasepool Person * somePerson = [[Personallokation] init];  return 0; 

Das Person * SomePerson Ausdruck deklariert eine aufgerufene Variable irgend eine Person und sagt dem Compiler, dass er eine Instanz der Person Klasse. Das Sternchen neben dem Variablennamen zeigt an, dass es sich um ein Zeiger, Dies ist die gebräuchlichste Methode zum Referenzieren von Objekten in Objective-C. Wir werden die Punkte auf der Straße ausführlicher besprechen.

Als nächstes die [[Person zuordnen] init] Code erstellt eine neue Instanz von Person Klasse. Die Notation in eckigen Klammern mag gewöhnungsbedürftig sein, ist aber konzeptionell die gleiche wie in Klammern, die für Methodenaufrufe in C # und anderen Simula-Sprachen verwendet werden. Das vorherige Codebeispiel entspricht dem folgenden in C #:

Person somePerson = neue Person (); somePerson.init ();

Das [Personenzuteilung] call ordnet den für die neue Instanz erforderlichen Speicher zu drin call wird verwendet, um einen beliebigen benutzerdefinierten Initialisierungscode auszuführen. Beachten Sie, dass es in Objective-C keine "Konstruktormethoden" gibt, wie in C # oder C ++ - Sie müssen die Methode manuell aufrufen drin Methode (oder eine Variante davon), um Ihr Objekt einzurichten. Daher ist praktisch die gesamte Objekterstellung in Objective-C ein zweistufiger Prozess: Zuordnen und dann Initialisieren. Sie werden dieses Muster häufig in Objective-C-Programmen sehen.


Methoden aufrufen

Nun, da wir ein Objekt haben, mit dem wir arbeiten können, können wir unser nennen sag Hallo Methode. Beachten Sie, dass die korrekte Terminologie in Objective-C "Senden einer Nachricht" ist, nicht "Aufruf einer Methode", aber für unsere Zwecke können wir sie als synonym behandeln. Fügen Sie folgende Zeile hinzu main.m:

[somePerson sayHello];

Genau wie das zuteilen/drin Methoden im vorherigen Beispiel verwendet der Aufruf benutzerdefinierter Methoden eckige Klammern. Dies ist wieder das gleiche wie das Ausführen somePerson.sayHello () in C #. Das Programm sollte jetzt angezeigt werden Hallo, ich heiße HAL. im Xcode-Ausgabefeld:

Ausgabe, die von der Methode sayHello generiert wird

Methodenparameter hinzufügen

Abgesehen von den eckigen Klammern sind die Methodenbenennungskonventionen von Objective-C eine der größten Anpassungen für Entwickler, die aus C #, C ++, Java, Python oder fast jeder anderen Sprache stammen, die nicht Smalltalk ist. Objective-C-Methodennamen sind so beschreibend wie möglich gestaltet. Die Idee ist, eine Methode so zu definieren, dass das Vorlesen buchstäblich sagt, was sie tut.

Fügen wir als Beispiel a ein Name Parameter zu unserem sag Hallo Methode. Zuerst müssen wir die Methodendeklaration im Header aktualisieren (Person.h):

- (void) sayHelloToName: (NSString *) aName;

Einen Parameter hinzufügen hat den Namen der Funktion geändert-Der Parameter ist keine isolierte Entität wie in C # (z., sayHello (Name)). Das (NSString *) Teil definiert den Datentyp des Parameters und ein Name ist die tatsächliche Variable, auf die im Implementierungscode zugegriffen werden kann, den wir jetzt definieren. Veränderung sag Hallo im Person.m zu dem folgenden Codebeispiel. Xcode sollte den neuen Methodennamen automatisch vervollständigen, wenn Sie mit der Eingabe beginnen.

- (void) sayHelloToName: (NSString *) aName NSLog (@ "Hallo% @, mein Name ist HAL.", aName); 

Das neue NSLog () Die Konfiguration verwendet eine Formatzeichenfolge zum Hinzufügen von ein Name Argument für die Ausgabe. Wir werden abdecken NSLog () Im nächsten Kapitel detaillierter, aber jetzt müssen Sie nur wissen, dass es ersetzt wird % @ im Formatstring mit ein Name. Das entspricht ungefähr String.Format () in C #.

Aufruf des Parameters ein Name mag mit überflüssig erscheinen sayHelloToName, Es ist jedoch sinnvoller, wenn Sie die Methode lesen, als würde sie aufgerufen. Im main.m, ändere das sag Hallo Aufruf:

[somePerson sayHelloToName: @ "Rechnung"];

Jetzt sollten Sie in der Lage sein, Ihr Programm auszuführen und zu sehen Hallo Bill, ich heiße HAL. im Ausgabefeld. Wie Sie sehen können, sind Objective-C-Methodennamen ausführlich, aber sehr informativ. Im Gegensatz zum C # -Stil sayHello (Name) Aufruf, Objective-C macht es sehr schwer, versehentlich den falschen Wert an eine Methode zu übergeben. Der Nachteil ist natürlich, dass die Methodennamen lang sind, aber deshalb bietet Xcode eine solche praktische Funktion zur automatischen Vervollständigung. In diesem Buch werden viele ausführlichere (und praktischere) Beispiele für Objective-C-Methodennamen angezeigt.


Eigenschaften definieren

Enthaltenes Codebeispiel: Mit Eigenschaften

Wie bei jeder objektorientierten Sprache können Objective-C-Methoden den internen Zustand eines Objekts beeinflussen. Dieser Status wird normalerweise als ein Satz von Eigenschaften dargestellt, die an ein Objekt angehängt sind. Zum Beispiel können wir eine hinzufügen Name Eigentum an unserem Person Schnittstelle, um den Namen jeder Instanz dynamisch zu speichern:

@ property (copy) NSString * name;

Das @Eigentum Deklaration beginnt eine neue Eigenschaft, die (Kopieren) Tupel gibt das Verhalten der Eigenschaft an, und NSString * Name Definiert eine Eigenschaft, die aufgerufen wird Name das enthält einen String-Wert. Normalerweise werden Eigenschaftendeklarationen vor Methodendeklarationen platziert, solange sie sich irgendwo dazwischen befinden @Schnittstelle und @Ende im Person.h, es wird Dir gut gehen.

Verwenden @Eigentum statt privater Attribute haben Sie Zugriff auf die @ synthetisieren Direktive in der Implementierungsdatei. Sie können damit automatisch Zugriffsmethoden für die zugeordnete Eigenschaft erstellen. Zum Beispiel in Person.m, Fügen Sie Folgendes hinzu (wiederum treten Eigenschaftsimplementierungen normalerweise vor Methodenimplementierungen auf):

@synthesize name = _name;

@ synthetisieren ist eine Convenience-Anweisung, die den Compiler anweist, Getter- und Setter-Methoden für die Eigenschaft zu generieren. Der Teil nach dem = sign wird als Instanzvariable (d. h. privates Mitglied) für die Eigenschaft verwendet, was bedeutet, dass wir es verwenden können _Name um auf die name-Eigenschaft in zuzugreifen Person.m. Versuchen Sie beispielsweise, das zu ändern sayHelloToName Methode zu:

- (void) sayHelloToName: (NSString *) aName NSLog (@ "Hallo% @, mein Name ist% @.", aName, _name); 

Standardmäßig entspricht der Getter-Methodenname dem Eigenschaftennamen und der Setter hat dies einstellen dem großgeschriebenen Objektnamen vorangestellt. So können wir unsere dynamisch einstellen Person Name des Objekts durch Ändern main.m Zu dem Folgendem:

Person * somePerson = [[Personenzuweisung] init]; [somePerson setName: @ "HAL 9000"]; [somePerson sayHelloToName: @ "Rechnung"];

Das Ausführen Ihres Programms sollte jetzt produzieren Hallo Bill, ich heiße HAL 9000.


Zusammenfassung

In diesem Kapitel wurden die grundlegenden Komponenten einer Objective-C-Klasse vorgestellt. Wir haben gelernt, Klassen in Schnittstellen zu unterteilen ( .h) und Implementierungsdateien ( .m), Objekte instanziieren, Methoden definieren und aufrufen und Eigenschaften deklarieren. Hoffentlich fühlen Sie sich mit Objective-Cs Notation und anderen syntaktischen Macken etwas wohler.

Denken Sie daran, dass dieses Kapitel eine schnelle Einführung in die OOP-Konstrukte von Objective-C ist und keine eingehende Erörterung der einzelnen Komponenten. In den nächsten Kapiteln werden Datentypen, Eigenschaftendeklarationen, Methodendefinitionen sowie die gängigen Entwurfsmuster von Objective-C-Programmen genauer beschrieben.

Diese Lektion stellt ein Kapitel von Objective-C Succinctly dar, ein kostenloses eBook des Teams von Syncfusion.