Da sich die Grundlagen von C noch in Ihrem Gedächtnis befinden, ist es an der Zeit, sich mit Objective-C vertraut zu machen. Der Hauptunterschied zu C ist, dass Objective-C eine objektorientierte Programmiersprache ist, während C eine prozedurale Programmiersprache ist. Das bedeutet, dass wir zuerst Objekte verstehen müssen und wie sie sich auf Klassen beziehen. Weitere Schlüsselkonzepte, die in diesem Artikel behandelt werden, sind Objektmitteilung, Einkapselung und Vererbung.
Objective-C und Cocoa sind zwei Schlüsselkomponenten der iOS-Plattform. Obwohl die iOS-Plattform noch relativ jung ist, wurde Objective-C in den frühen 80er Jahren von Brad Cox und Tom Love bei StepStone entwickelt. Die Sprache wurde entwickelt, um die robuste und agile C-Programmiersprache mit der eleganten Smalltalk-Sprache zu kombinieren. Objective-C ist eine strikte Obermenge von C und im Gegensatz zu C eine Programmiersprache auf hohem Niveau. Der Hauptunterschied zwischen C und Objective-C besteht darin, dass diese eine objektorientierte Programmiersprache ist, während C eine prozedurale Programmiersprache ist.
Wie kam es zu einer Sprache, die in den 1980er Jahren entwickelt wurde? Kurz nachdem NeXT von Steve Jobs gegründet wurde, wurde Objective-C von StepStone lizenziert. NeXT entwickelte NeXTSTEP, ein Toolkit für die Benutzeroberfläche für das in Objective-C entwickelte NeXT-Betriebssystem. Obwohl NeXTSTEP ein revolutionäres Werkzeugset zur Verfügung stellte, erzielte das NeXT-Betriebssystem auf dem Markt nur eine geringe Zugkraft. 1996 übernahm Apple NeXT und NeXTSTEP wurde Cocoa. Letzteres wurde mit der Einführung von OS X im März 2001 und später mit der Veröffentlichung des iPhone und des Betriebssystems iOS zum Mainstream.
Bei der prozeduralen Programmierung besteht ein Programm aus eine Reihe von Prozeduren oder Routinen die ausgeführt werden, um einen bestimmten Zustand zu erreichen. In der objektorientierten Programmierung jedoch, Eine Sammlung von Objekten interagiert und arbeitet zusammen eine Aufgabe erledigen. Obwohl das Endergebnis identisch sein kann, unterscheiden sich die Methodik und die zugrunde liegenden Paradigmen erheblich. Modularität und Wiederverwendbarkeit von Code sind zwei der Hauptvorteile objektorientierter Programmiersprachen, wie wir bald sehen werden.
Entwickler, die sich mit den iOS- und OS X-Ökosystemen noch nicht auskennen, werden oft durch die Beziehung zwischen Objective-C, Cocoa (OS X) und Cocoa Touch (iOS) verwirrt. Was ist Cocoa Touch und in welcher Beziehung steht es zu Objective-C? Cocoa ist Apples native Anwendungsprogrammierschnittstelle (API) für iOS- und OS X-Plattformen. Objective-C ist die Sprache, die Kakao antreibt. Während sich dieser Artikel hauptsächlich auf die Programmiersprache Objective-C konzentriert, werden wir uns die APIs von Cocoa und Cocoa Touch später in dieser Serie genauer ansehen.
Ein weiterer Stolperstein für Entwickler, die neu in der objektorientierten Programmierung sind, ist die Unterscheidung zwischen Klassen, Objekten und Instanzen. Eine Klasse ist eine Besetzung oder ein Bauplan zum Erstellen von Objekten, während Instanzen eindeutige Vorkommen einer Klasse sind. Ein Objekt ist eine Datenstruktur mit Status und Verhalten. Trotz des subtilen Unterschieds zwischen Objekten und Instanzen werden beide Begriffe häufig austauschbar verwendet.
Schauen wir uns ein Beispiel an: Toaster. Bevor ein Toaster hergestellt wird, erstellen Ingenieure einen Bauplan, der einer Klasse entspricht. Jeder aus dem Bauplan erstellte Toaster ist eine Instanz oder ein eindeutiges Vorkommen der Klasse. Obwohl jeder Toaster aus demselben Bauplan (derselben Klasse) erstellt wird, haben sie jeweils ihren eigenen Zustand (Farbe, Anzahl der Steckplätze usw.) und ihr Verhalten.
Der Status einer Instanz wird in ihren Instanzvariablen oder den Attributen des Objekts gespeichert und definiert, wenn Sie möchten. Dies bringt uns zu einem anderen Schlüsselmuster der objektorientierten Programmierung: Verkapselung. Kapselung bedeutet, dass die interne Darstellung eines Objekts privat ist und nur dem Objekt selbst bekannt ist. Dies mag auf den ersten Blick wie eine starke Einschränkung erscheinen. Das Ergebnis ist jedoch modularer und lose gekoppelter Code.
Lassen Sie uns die Kapselung an einem anderen Beispiel veranschaulichen. Die Geschwindigkeit eines Autos wird durch die Innenteile des Autos gemessen, der Fahrer kennt jedoch die Geschwindigkeit des Autos, indem er auf den Tachometer schaut. Der Fahrer muss die Innenausstattung des Fahrzeugs nicht kennen oder verstehen, um die Geschwindigkeit des Fahrzeugs zu kennen. Ebenso muss der Fahrer des Autos nicht verstehen, wie Motoren funktionieren, um das Auto fahren zu können. Die Details, wie ein Auto funktioniert, sind dem Fahrer verborgen. Der Zustand und das Verhalten des Autos ist dem Fahrer verborgen und ist zugänglich durch die Fahrzeugschnittstelle (Lenkrad, Bremspedal, Armaturenbrett usw.).
Ein weiteres mächtiges Paradigma der objektorientierten Programmierung ist Klassenvererbung. Wenn Klasse A a ist Unterklasse von Klasse B erbt Klasse A die Attribute und das Verhalten von Klasse B. Klasse B wird als übergeordnete Klasse oder Superklasse von Klasse A bezeichnet. Die Vererbung fördert auch die Wiederverwendbarkeit und Modularität von Code.
Methoden sind Subroutinen, die einer Klasse zugeordnet sind. Sie definieren das Verhalten einer Klasse und ihrer Instanzen. Die Methoden einer Klasse haben Zugriff auf die Interna einer Instanz und können dadurch den Status der Instanz ändern. Mit anderen Worten, der Zustand einer Instanz (d. H Instanzvariablen) wird durch die Methoden einer Instanz (d. h. der Instanzmethoden).
Aufgrund des Einkapselungsmusters kann auf die Instanzvariablen einer Klasseninstanz nicht frei zugegriffen werden. Stattdessen wird über sie zugegriffen Getter und Setter, Methoden mit dem einzigen Zweck, Instanzvariablen abzurufen und festzulegen. Eigenschaften sind eine Funktion von Objective-C, die die Erstellung von Accessoren (Getter und Setter) einfach macht. Trotz der Nützlichkeit von Zugriffsmethoden wird das Schreiben von Zugriffsmethoden für jede Instanzvariable schnell umständlich. Wir werden die Eigenschaften später in diesem Artikel genauer untersuchen. Betrachten Sie Eigenschaften zunächst als Wrapper für Instanzvariablen, die die Arbeit mit Instanzvariablen über Getter und Setter erleichtern.
Lassen Sie uns unser Wissen in die Praxis umsetzen, indem Sie ein neues Xcode-Projekt erstellen, mit dem Sie arbeiten können. Erstellen Sie ein neues Projekt in Xcode, indem Sie auswählen Neu> Projekt… von dem Datei Speisekarte.
Wählen Sie wie im vorherigen Artikel die Option Befehlszeilenwerkzeug Projektvorlage in der Anwendung Kategorie unter der OS X Sektion.
Stellen Sie das ein Produktname zu Bücher und geben Sie dem Projekt einen Organisationsnamen und eine Firmenkennung. Für dieses Projekt ist es wichtig, den Projekttyp auf festzulegen Stiftung. Der Grund für diese Entscheidung wird später in diesem Artikel deutlich.
Teilen Sie Xcode mit, wo Sie das Projekt speichern möchten, und klicken Sie auf die Schaltfläche Erstellen Taste. Möglicherweise stellen Sie fest, dass das Projekt anders aussieht als das Projekt, das wir zum Lernen von C erstellt haben. Nehmen wir uns einen Moment Zeit, um die Unterschiede zu sehen.
Das Projekt enthält einige Dateien und Ordner mehr als das Befehlszeilentool, das wir im vorherigen Artikel erstellt haben. Zusätzlich zu main.m und Bücher.1, Es gibt zwei neue Ordner, Unterstützende Dateien und Frameworks, jeder enthält einen Artikel.
Unterstützende Dateien enthält eine Datei mit dem Namen Bücher-Prefix.pch. Das .pch Die Dateierweiterung sagt uns, dass dies eine vorkompilierte Header-Datei. Ihr Zweck wird später in dieser Serie klar.
Das Frameworks Ordner enthält die Frameworks, mit denen das Projekt verknüpft ist. Was ist ein Rahmen? Ein Framework ist ein Bundle oder Verzeichnis, das eine Bibliothek einschließlich ihrer Ressourcen wie Bilder und Header-Dateien enthält. Das Konzept einer Header-Datei wird in einer Minute klar. Das Frameworks Ordner enthält derzeit ein Element, Foundation.framework.
Beim Erstellen des Projekts legen Sie den Projekttyp auf fest Stiftung, Dies bedeutet, dass das Projekt an das Fundament-Framework gekoppelt ist. Das Foundation-Framework ist ein grundlegender Satz von Objective-C-Klassen. Später in dieser Serie werden wir uns das Fundament-Framework genauer ansehen.
Es ist Zeit, deinen ersten Kurs zu erstellen. Wann immer Sie eine neue Datei erstellen (Datei> Neu> Datei… ) wird eine Liste mit Dateivorlagen angezeigt. Wählen Kakao von dem OS X Abschnitt und wählen Sie die Ziel-C-Klasse Vorlage zum Erstellen einer neuen Objective-C-Klasse. Klicken Nächster weitermachen.
Geben Sie der neuen Klasse einen Namen Buch
und setzen Sie seine Unterklasse auf NSObject
. Wie wir zuvor gesehen haben, indem wir die neue Klasse zu einer Unterklasse machen NSObject
, Die neue Klasse erbt die Attribute und das Verhalten von NSObject
. Dies bedeutet, dass das Neue Buch
Klasse bekommt einige Funktionen kostenlos.
Klicken Nächster um fortzufahren und Xcode anzugeben, wo Sie die neue Klasse speichern möchten. Stellen Sie sicher, dass Sie die neue Klasse irgendwo in Ihrem Xcode-Projekt speichern.
Xcode hat dem Projekt zwei neue Dateien hinzugefügt, Book.h und Book.m. Book.h ist die Headerdatei des Buch
Klasse und macht die Klassenschnittstelle verfügbar, wie wir zuvor gesehen haben. Eine Klassenschnittstelle enthält die Eigenschaften und Methoden der Klasse und gibt auch die Superklasse der Klasse an. Book.m ist die Implementierungsdatei der Klasse und definiert ihr Verhalten durch Implementierung der in der Klassenheaderdatei deklarierten Methoden.
Öffnen Book.h und erforschen Sie den Inhalt. Abgesehen von einigen Kommentaren oben enthält die Header-Datei nur drei Codezeilen. Die erste Zeile importiert die Header-Datei des Foundation Frameworks. Dies stellt sicher, dass die Buch
Klasse hat Zugriff auf die Klassen und Protokolle, die im Foundation Framework deklariert sind.
#einführen
Die zweite und dritte Zeile bilden ein Paar. In Objective-C beginnt jede Klassenschnittstelle mit @Schnittstelle
und endet mit @Ende
, Dies sind beide Anweisungen des Compilers, dh Befehle oder Anweisungen für den Compiler. Das @Schnittstelle
Direktive folgt der Name der Klasse, ein Doppelpunkt und die Klasse Oberklasse-wenn anwendbar. Wie wir zuvor gesehen haben, ist die übergeordnete Klasse oder Superklasse die Klasse, von der sie Attribute und Verhalten erbt.
@Interface Book: NSObject @end
NSObject
ist die Wurzelklasse der Mehrheit der Objective-C-Klassen. Die ersten zwei Buchstaben, NS, beziehen Sie sich auf NeXTSTEP, wie wir weiter oben in diesem Artikel gesehen haben. Durch das Erben von NSObject
, Klassen verhalten sich wie Objective-C-Klassen und erben eine grundlegende Schnittstelle für das Laufzeitsystem.
Bevor wir Änderungen an der Buch
Klasse, lassen Sie uns einen kurzen Blick darauf werfen Book.m, die Implementierungsdatei der Klasse. Anstatt das Foundation Framework zu importieren, importiert die Implementierungsdatei die Header-Datei von Buch
Klasse. Warum ist das nötig? Die Implementierungsdatei muss wissen, welche Eigenschaften und Methoden in der Headerdatei deklariert sind, bevor das Verhalten (d. H. Die Methoden) der Klasse implementiert werden kann. Auf die Importanweisung folgt die Implementierung der Klasse, die durch angegeben wird @Implementierung
und @Ende
.
Das Buch
Klasse ist in der aktuellen Implementierung nicht sehr nützlich. Gehen Sie zur Header-Datei und fügen Sie drei Eigenschaften hinzu Jahr
, Titel
, und Autor
, und fügen Sie eine Methode mit dem Namen bookInfo
.
Eigenschaften werden mit deklariert @Eigentum
Schlüsselwort und kann irgendwo in der Klasse deklariert werden @Schnittstelle
Block. Das @Eigentum
Auf das Schlüsselwort folgt der Typ und der Name der Eigenschaft. Vergessen Sie nicht das Sternchen vor dem Titel
und Autor
Eigenschaften, da ein Cocoa-Objekt immer als Zeiger referenziert wird.
#einführen@ Interface Book: NSObject @ Eigenschaft int Jahr; @ property NSString * title; @ property NSString * Autor; - (NSString *) bookInfo; @Ende
Die Methodendeklaration ähnelt etwas einem Funktionsprototyp, es gibt jedoch einige wichtige Unterschiede. Die Methodendeklaration beginnt mit einem Minuszeichen, um anzuzeigen, dass es sich um eine Instanzmethode handelt. Klassenmethoden werden ein Pluszeichen vorangestellt. Dem Minuszeichen folgt der Rückgabetyp der Methode zwischen Klammern, einer Instanz von NSString
, und der Name der Methode. Die Methodendeklaration endet mit einem Semikolon.
Ich bin sicher, Sie fragen sich was NSString
ist und warum es als Zeiger referenziert werden muss. Das NSString
class ist Mitglied des Foundation Frameworks. Es deklariert die Schnittstelle für ein Objekt, das eine unveränderliche Zeichenfolge verwaltet. Im vorigen Artikel haben wir gesehen, dass eine Zeichenfolge in C durch ein Array von Zeichen dargestellt werden kann NSString
Klasse tut, verwaltet es eine Reihe von Zeichen unter der Haube. Der Vorteil der Verwendung NSString
ist, dass es die Arbeit mit Saiten wesentlich einfacher macht.
bookInfo
Nun, da wir das erklärt haben bookInfo
Methode in der Header-Datei der Klasse, ist es Zeit, sie in der Implementierungsdatei der Klasse zu implementieren. Öffnen Book.m und fügen Sie das folgende Code-Snippet irgendwo in der @Implementierung
Block. Bevor wir die Implementierung von brechen bookInfo
unten müssen wir zuerst über Object Messaging sprechen.
- (NSString *) bookInfo NSString * bookInfo = [NSString stringWithFormat: @ "% @ wurde von% @ geschrieben und in% i veröffentlicht", self.title, self.author, self.year]; return bookInfo;
Wir wissen bereits, dass das Verhalten einer Klasse durch ihre Methoden definiert wird. Um eine Methode für ein Objekt aufzurufen, wird eine Nachricht an das Objekt gesendet. Überprüfen Sie das folgende Codefragment, um dieses Konzept zu verstehen. Brechen wir es Zeile für Zeile auf. In der ersten Zeile deklarieren wir einen neuen String und weisen ihm einen konstanten String zu, indem der String in Anführungszeichen gesetzt und mit einem vorangestellten vorangestellt wird @
Zeichen.
NSString * string = @ "Dies ist eine Zeichenfolge."; int length = [Stringlänge]; NSLog (@ "Die Länge der Zeichenfolge beträgt% i. \ N" Länge);
In der zweiten Zeile senden wir eine Nachricht von Länge
zur String-Instanz. Mit anderen Worten, wir nennen die Methode Länge
in der String-Instanz und die Methode gibt eine Ganzzahl zurück. Die Ganzzahl wird dem zugewiesen Länge
Variable vom Typ int
. In der letzten Zeile protokollieren wir die Längenvariable in der Konsole durch Aufruf von NSLog
Funktion, wie wir im vorherigen Artikel gesehen haben.
Das Senden von Nachrichten an Objekte ist etwas, das Sie häufig tun werden. Daher ist es wichtig, die Syntax zu verstehen. Auch wenn die Syntax seltsam aussieht, wenn Sie Objective-C noch nicht kennen, ist das gar nicht so schwer zu verstehen. Zwischen eckigen Klammern befindet sich das Objekt links und der Name der Nachricht oder der Methode rechts.
[Objektnachricht];
Methoden, die Argumente akzeptieren, sehen ein wenig anders aus, die allgemeine Syntax ist jedoch identisch. Das NSString
Klasse hat zum Beispiel eine andere Methode substringFromIndex:
. Der Doppelpunkt am Ende des Namens zeigt an, dass diese Methode ein Argument akzeptiert. Das Aufrufen dieser Methode für einen String sieht folgendermaßen aus:
NSString * substring = [Zeichenfolge substringFromIndex: 5];
Objective-C ist bekannt für seine langen und ausführlichen Methodennamen. Sehen Sie sich das folgende Beispiel an, das einen Methodennamen mit mehreren Argumenten enthält. Sie müssen zugeben, dass der Name der Methode eindeutig die Funktion der Methode angibt. Der Methodenname wird in Blöcke aufgeteilt, wobei jeder Abschnitt ein Argument akzeptiert. Wenn Sie mit dem iOS-SDK arbeiten, werden sich die Objektnachrichten wirklich bemerkbar machen.
NSString * anotherString = [string stringByPaddingToLength: 5 withString: @ "einige Zeichenfolge" startingAtIndex: 2];
Bevor wir fortfahren, müssen wir die Implementierung von überdenken bookInfo
. Die Methodenimplementierung beginnt mit der Wiederholung der Methodendeklaration. Das nachfolgende Semikolon wird durch ein Paar geschweifte Klammern ersetzt, die die Implementierung der Methode umgeben. Wir deklarieren zuerst eine neue Zeichenfolge, bookInfo
, und weisen Sie ihm eine neue Zeichenfolge zu, die mit den Attributen unserer Buchinstanz erstellt wurde (Titel
, Autor
, und Jahr
). Am Ende von bookInfo
Methode geben wir den neuen String zurück, bookInfo
, denn das erwartet die Methode, eine Zeichenkette als Rückgabetyp.
Drei Dinge bedürfen einer Klarstellung. Zuerst die Methode stringWithFormat:
ist eine Klassenmethode und keine Instanzmethode. Wir wissen das, weil die Methode für die Klasse selbst aufgerufen wird, NSString
, nicht auf einer Instanz der Klasse. Klassenmethoden sind in objektorientierten Programmiersprachen üblich. Zweitens wird der Formatbezeichner für ein Objekt durch die dargestellt @
Symbol (vorangestelltes Prozentzeichen). Beide Titel
und Autor
sind Objektstrings, um genau zu sein. Drittens die selbst
Schlüsselwort verweist immer auf die Klasseninstanz. In diesem Fall, selbst
bezieht sich auf Buch
Instanz, zu der die Methode bookInfo
gehört.
Wenn Sie mit anderen objektorientierten Sprachen gearbeitet haben, kann der Zugriff auf Instanzvariablen in Objective-C verwirrend sein. Beim Schreiben greifen wir nicht direkt auf eine Instanzvariable zu selbst.titel
. Dies ist nichts anderes als eine Abkürzung für [Selbsttitel]
. Letzteres bedeutet, dass wir die getter-Methode verwenden, um die Instanz nach der benannten Instanzvariablen zu fragen Titel
. Gleiches gilt für das Setzen einer Instanzvariablen. Schauen Sie sich den folgenden Code-Ausschnitt an. Wie Sie sehen können, ist die Verwendung von selbst.titel
ist nichts weiter als syntaktischer Zucker.
// Diese Zuordnung… self.title = @ "Der Hobbit"; //… ist äquivalent zu… [self setTitle: @ "The Hobbit"];
Ich würde
, Null
, und NULL
Ich würde
Bevor wir mit der Verwendung beginnen Buch
Klasse, ich möchte über ein paar Stichworte sprechen, die die Leute von Zeit zu Zeit verwirren. Wann immer Sie ein Objekt speichern möchten, ohne den Typ dieses Objekts explizit zu definieren, verwenden Sie die Ich würde
Datentyp, der auch der Standardtyp für Rückgabe- und Argumentdeklarationen für Objective-C-Methoden ist.
Die Macht und Nützlichkeit der Ich würde
Der Datentyp geht jedoch noch viel weiter. Das Ich würde
Der Datentyp ist eine Schlüsselkomponente der dynamischen Typisierung und dynamischen Bindung von Objective-C. Es ist wichtig zu verstehen, dass die Ich würde
Datentyp enthält keine Informationen über das Objekt selbst, außer dass es sich um ein Objekt handelt.
In Objective-C weiß jedes Objekt, zu welcher Klasse es gehört (durch ein ist ein
Variable) und dies ist kritisch. Warum das? Eine der Stärken von Objective-C ist die dynamische Typisierung, dh die Typprüfung wird zur Laufzeit statt zur Kompilierzeit durchgeführt.
Jedoch seit dem Ich würde
Da der Datentyp dem Compiler nichts über die Klasse mitteilt, zu der das Objekt gehört, muss das Objekt selbst diese Informationen an den Compiler übergeben.
Denken Sie daran, dass es absolut akzeptabel ist, ein Objekt statisch in Objective-C einzugeben, indem Sie die Klasse eines Objekts explizit angeben, anstatt die Ich würde
Datentyp.
Dies bringt uns zu einer weiteren wichtigen Komponente der Objective-C-Laufzeit, der dynamischen Bindung. In Objective-C besteht ein wichtiger Unterschied zwischen Funktionen und Nachrichten darin, dass eine Nachricht und das empfangende Objekt erst zur Laufzeit zusammengefügt werden.
Was bedeutet das und warum ist das wichtig? Dies bedeutet, dass die als Reaktion auf eine an ein Objekt gesendeten Nachricht aufgerufene Methode zur Laufzeit bestimmt wird, wenn sowohl die Nachricht als auch das Objekt bekannt sind. Dies ist die sogenannte dynamische Bindung.
Null
und NULL
In Objective-C das Schlüsselwort Null
ist als a definiert Null
Objekt, das heißt ein Ich würde
mit einem Wert von 0
. Unter der Haube gibt es keinen Unterschied Null
, Null
, und NULL
, und es ist möglich, Nachrichten an jeden von ihnen zu senden, ohne dass eine Ausnahme ausgelöst wird.
Die Konvention ist zu verwenden Null
für Objekte, Null
für den Unterricht und NULL
Andernfalls. Nachrichten senden können Null
, Null
, und NULL
hat Vorteile, hat aber auch Nachteile. Weitere Informationen zu Null
, Null
, und NULL
, Werfen Sie einen Blick auf diese Frage zu Stack Overflow.
Öffnen main.m und fügen Sie eine Importanweisung hinzu, um die Header-Datei des zu importieren Buch
Klasse. Anstatt spitze Klammern zu verwenden, verwenden wir doppelte Anführungszeichen, um die Header-Datei von zu importieren Buch
Klasse. Für lokale Dateien werden doppelte Anführungszeichen verwendet, während für globale Include-Werte spitze Klammern verwendet werden, wobei der Include-Pfad des Projekts verwendet wird.
#einführen#import "Book.h"
Direkt unter dem NSLog
Aufruf, fügen Sie das folgende Snippet hinzu, um eine Instanz von zu erstellen Buch
Klasse.
Book * book1 = [[Buchzuordnung] init]; book1.title = @ "Der Hobbit"; book1.author = @ "JRR Tolkien"; book1.year = 1937;
In der ersten Zeile deklarieren wir eine Variable vom Typ Buch
und initialisieren Sie es. Dies ist ein gutes Beispiel, um verschachtelte Methodenaufrufe zu veranschaulichen. Die erste Methode forderte die Buch
Klasse ist zuteilen
. Die Details dieses Anrufs sind nicht wichtig. Der Kern ist, dass die Erinnerung ist zuteilenfür das neue Objekt festgelegt und das Objekt wird erstellt.
Aufgrund der Verschachtelung der Anrufe wird der drin
Die Methode wird für das neue Objekt aufgerufen, das von erstellt wurde zuteilen
Methode. Das drin
Methode drinialisiert das neue Objekt, richtet es ein und macht es einsatzbereit. Das drin
Die Methode gibt die Instanz zurück und weist sie in unserem Beispiel der zu Buch 1
Variable.
Die nächsten drei Zeilen sollten bekannt sein. Wir legen den Titel, den Autor und das Erscheinungsjahr des neuen Buches fest.
Erstellen wir ein weiteres Buch und fügen Sie beide Bücher zu einem Objective-C-Array hinzu. Die Erstellung des zweiten Buches ist nicht neu. Der einzige Unterschied besteht darin, dass wir die Setzer der Klasse explizit verwendet haben, um die Instanzvariablen der neuen Instanz festzulegen.
Buch * book2 = [[Buchzuordnung] init]; [book2 setTitle: @ "Die Gefährtenschaft des Ringes"]; [book2 setAuthor: @ "JRR Tolkien"]; [book2 setYear: 1954]; NSArray * books = [[NSArray-Zuordnung] initWithObjects: book1, book2, nil];
In der letzten Zeile erstellen wir eine Instanz von NSArray
, eine andere Klasse des Foundation-Frameworks. Das NSArray
Klasse ist ein Array, in dem eine geordnete Liste von Objekten gespeichert werden kann. Genau wie bei den Book-Instanzen weisen wir Speicher zu und initialisieren das neue Array.
Anstatt zu rufen drin
, Wir rufen jedoch an initWithObjects:
. initWithObjects:
ist ein ausgewiesener Initialisierer, was bedeutet, dass es ein drin
Methode mit einigen zusätzlichen Schnickschnack, um die Objektinitialisierung zu erleichtern.
initWithObjects:
akzeptiert eine beliebige Anzahl von Objekten, die Sie im Array speichern möchten. Die Liste der Objekte sollte immer mit enden Null
.
Ich habe bereits mehrfach erwähnt, dass Objective-C eine strikte Obermenge von C ist und dass wir C und Objective-C frei kombinieren können. Mal sehen, wie das funktioniert. Wir beginnen mit einem einfachen ansonsten
Anweisung, um zu prüfen, ob das Array Objekte enthält. Senden Sie dem Array eine Nachricht von Anzahl
, Es wird die Anzahl der enthaltenen Objekte zurückgegeben.
Wenn das Array Objekte enthält, verwenden wir a zum
Schleife, um die Objekte im Array zu durchlaufen. Während jeder Iteration fragen wir das Array nach dem Objekt am Index ich
und senden Sie das Objekt - eine Instanz des Buch
Klasse-eine Nachricht von bookInfo
. Wie wir früher gesehen haben, bookInfo
gibt eine Instanz von zurück NSString
, die wir an der Konsole anmelden.
if ([Anzahl der Bücher]> 0) für (int i = 0; i < [books count]; i++) Book *aBook = [books objectAtIndex:i]; NSLog(@"%@", [aBook bookInfo]);
Ich bin mir sicher, dass Sie von Objective-C etwas überwältigt sind. Das ist normal. Obwohl Objective-C nicht mehr als eine dünne Schicht über der C-Sprache ist, ist viel los.
Während Objective-C mehr bietet als in diesem Artikel beschrieben, kennen Sie jetzt die Grundlagen und können mit dem iOS SDK arbeiten. Im nächsten Artikel werden wir uns das iOS SDK ansehen und seine verschiedenen Komponenten untersuchen.