Willkommen zum dritten Teil dieser Serie. Ich hoffe, es gefällt euch! Letzte Woche haben wir uns angeschaut, wie wir Klassen in Dateien (Schnittstelle und Implementierung) aufteilen, diese Woche werden wir uns die Klassen noch einmal genauer ansehen, aber ein wenig mehr vertiefen. Wir werden auch einen Überblick über die Vererbung und deren Funktionsweise sowie den Umfang der Variablen erhalten.
Bisher hatten wir einige großartige Rückmeldungen per E-Mail, Twitter und Kommentare. Es ist großartig zu sehen, dass sich so viele Leute für dieses Thema interessieren und es ist noch besser zu sehen, dass so viele von euch es selbst ausprobieren und einige großartige Fragen stellen. Mach weiter!
Lassen Sie uns wiederholen, was wir bisher über die Klassen in dieser Serie gelernt haben. Wenn Sie nichts davon wissen, können Sie das letzte Tutorial erneut aufrufen. Ok, was sind Klassen??
Eine Klasse ist eine Sammlung gekapselter Daten und benutzerdefinierter Methoden. Eine Klasse kann viele verschiedene Arten von Daten enthalten, und die Klassenmethoden führen normalerweise (aber nicht immer) Aktionen aus, die sich auf diese Daten beziehen. In Objective-C besteht eine Klasse normalerweise aus zwei Dateien: einer Schnittstellendatei und einer Implementierungsdatei. In der Schnittstellendatei wird die .h-Dateierweiterung nach Konvention verwendet. Dort kann die Person, die die Klasse verwendet, die für die Klasse verfügbaren Methoden und Datenmitglieder schnell finden. Die Implementierungsdatei verwendet die .m-Dateierweiterung nach Konvention. Dort befindet sich der Großteil des Codes, da sie die tatsächliche Implementierung aller in der Schnittstelle deklarierten Funktionen enthält.
Was unterscheidet eine Klasse von einem Objekt? Was ist ein Objekt? Ein Objekt ist eine Instanz einer Klasse. Denken Sie an unser Beispiel mit dem Auto im letzten Teil der Serie. Woher Auto ist dann die Klasse mein Auto, dansCar, und dein Auto wären alle Objekte, weil sie Instanzen der Fahrzeugklasse sind.
Bevor wir weitermachen, möchte ich ein paar (von vielen) gängigen Klassen teilen, die Sie häufig verwenden werden, die von Apple angeboten werden, aber zunächst eine kurze Geschichtsstunde.
Viele Klassen, die Apple anbietet, werden von der Abkürzung "NS" (NextStep) vorangestellt. Als Steve Jobs Apple verließ, gründete er NeXT und erstellte Workstation-Computer, die unter seinem Betriebssystem ausgeführt wurden. Die objektorientierte Programmiersprache, die auf diesen Maschinen verwendet wurde, hieß NeXTSTEP, von wo aus wir das "NS" erhalten. Als Apple NeXTSTEP "akquirierte" (eine weitere Geschichtsstunde für sich), beschlossen sie, Mac OS X auf NeXTSTEP zu stützen.
Hier sind einige einfache, allgemeine Klassen, die wir häufig sehen werden:
Wir werden später noch viel mehr lernen, aber für den Moment wird sich dies als nützlich erweisen. Sie fragen sich wahrscheinlich, was veränderlich und unveränderlich bedeutet, was eine durchaus vernünftige Frage ist. Wenn ein Objekt ist unveränderlich Das heißt, wenn wir das Objekt erstellen und einen Wert zuweisen, ist es statisch. Der Wert kann nicht geändert werden. Wenn ein Objekt ist veränderlich Dann ist es dynamisch, dh der Wert kann nach der Erstellung geändert werden.
Nehmen wir an, wir möchten eine statische Zeichenfolge aus Text erstellen und ihn protokollieren. Wie gehen wir vor? In unserem Code würde es ungefähr so aussehen:
#einführenint main (int argc, const char * argv []) NSString * testString; testString = [[NSString alloc] init]; testString = @ "Hier ist ein Teststring in testString!"; NSLog (@ "testString:% @", testString); 0 zurückgeben;
Ich habe diese Datei in XCode erstellt, indem ich zu ging Datei> Neues Projekt> Mac OS X> Anwendung> Befehlszeilenwerkzeug> Typ: Foundation (eine ziemlich große Reise!) und Bearbeiten der Implementierungsdatei (Erweiterung: .m) im Projekt.
Hier gibt es einige Dinge, die neu sind. Sehen wir uns das Stück für Stück an.
Zunächst importieren wir die Foundation Library (weil wir vorher im neuen Projektfenster den Typ Foundation festgelegt haben).
int main (int argc, const char * argv [])
Damit wird die anfängliche Funktion festgelegt, die aufgerufen wird, wenn unser Programm mit der Ausführung beginnt. Die zwei durch Komma getrennten Parameter dienen der Weiterleitung von Argumenten an unsere Anwendung. Im Moment machen Sie sich keine Sorgen über diese, da wir sie jetzt nicht brauchen werden.
NSString * testString; testString = [[NSString alloc] init];
Wir erstellen jetzt einen Zeiger auf ein NSString-Objekt namens testString. Sobald die erste Zeile fertig ist, existiert noch kein String, sondern nur ein Zeiger auf einen String, den wir noch nicht erstellt haben. In der nächsten Zeile erstellen wir die Zeichenfolge, auf die der Zeiger zeigt.
Wir hätten die letzte Zeile alternativ so schreiben können;
testString = [NSString-Zuordnung]; [testString init];
Das mag auf den ersten Blick etwas verwirrend erscheinen. In der ersten Version haben wir die Anweisungen in Klammern in dieselbe Zeile geschachtelt, während wir in der zweiten Version die Anweisungen in zwei Zeilen aufgeteilt haben. Die Methode init initialisiert alle Instanzvariablen in der Klasse.
testString = @ "Hier ist ein Teststring in testString!";
Diese Zeile ist ziemlich selbsterklärend. Der Grund, weshalb wir die Anführungszeichen mit einem @ -Zeichen voranstellen, ist, dem Compiler mitzuteilen, dass der folgende Text ein NSString ist.
NSLog (@ "testString:% @", testString);
Hier protokollieren wir einige Informationen zur Konsole. XCode verfügt über einen integrierten Debugger, den Sie im Menü Ausführen finden. Es ist sehr nützlich, wenn Sie eine Anwendung entwickeln, um zu protokollieren, wenn Ereignisse und die Werte bestimmter Variablen protokolliert werden. Dies kann bei der Problembehandlung Ihrer Anwendung und beim Debuggen von Problemen hilfreich sein. Diese Methode funktioniert wie printf (erinnern Sie sich an die erste Woche?), Bei der wir eine Textzeichenfolge mit einem Ersetzungszeichen angeben (% @ bedeutet ein Objective-C-Objekt)..
Schließlich geben wir 0 zurück, von dem wir wissen, dass das Betriebssystem ohne Probleme beendet wurde.
Erinnern Sie sich, als wir unseren NSString früher gemacht haben, haben wir die init-Methode verwendet? Nun, NSMutableString, NSArray und tatsächlich jede einzelne NS-Klasse verwendet auch init. Scheint viel verschwendeter Code, um die init-Methode in jede Klasse einzufügen, oder? Deshalb würde init normalerweise nur einmal in der als NSObject bezeichneten Stammklasse implementiert werden. Da Klassen voneinander erben, kann eine Klasse, die als untergeordnetes Element einer anderen erstellt wird, automatisch auf die übergeordneten Klassenmethoden zugreifen.
Nehmen wir zum Beispiel NSMutableString. NSMutableString hat NSString für ein übergeordnetes Element (wodurch es ein untergeordnetes Element wird), was bedeutet, dass es von NSString erbt. Inzwischen. NSString hat NSObject als übergeordnetes Element, daher erbt es von NSObject.
So hat zum Beispiel NSObject eine Methode namens init, also hat jede Unterklasse diese Methode implementiert - eine Klassenmethode. Tatsächlich macht die init-Methode in NSObject nichts, sondern gibt einfach selbst zurück. Der Grund dafür ist, dass Methoden überschrieben werden können. Die NSArray-Klasse überschreibt möglicherweise die von ihr geerbte Init-Instanz, um weitere Funktionen hinzuzufügen. So können Sie beispielsweise sicherstellen, dass Speicher verfügbar ist, oder die erforderlichen Instanzvariablen vorbereiten.
Wie gezeigt, ist dies nützlich, da wir nicht nur Klassen erben, sondern auch Klassen erweitern können. Wenn wir eine Klasse erweitern, übernehmen wir eine vorhandene Klasse und fügen zusätzliche Funktionen hinzu, die bereits verfügbar sind. Dies bedeutet, dass Sie Ihre eigene Version von NSString mit zusätzlichen Methoden erstellen können, z. B. mit einer Methode, um die Zeichenfolge mit zufälligem Text zu füllen oder eine Art Zeichencodierung durchzuführen.
An diesem Punkt sollten die Grundlagen für die Funktionsweise der Klassen klar sein. Um Ihr Verständnis zu testen, prüfen Sie, ob Sie die folgenden Fragen in Gedanken beantworten können:
Da Klassen ein so wichtiger Bestandteil von Objective-C sind, ist es wichtig, dass Sie sich beim Arbeiten mit ihnen wirklich wohl fühlen. Letzte Woche haben wir angefangen, den Unterricht anzuschauen, und diese Woche haben wir uns eingehender damit befasst. In der nächsten Woche werden Sie vielleicht froh sein zu hören, dass wir uns von der theoretischen Seite entfernen und anfangen werden, an unserer eigenen einfachen Klasse zu arbeiten, um einfache Aufgaben zu erledigen.
Da wir bisher hauptsächlich theoretisch gearbeitet haben, besteht Ihre Woche in dieser Woche darin, die Entwickler-Website von Apple zu durchsuchen (Sie sollten dies letzte Woche gemacht haben) und einige der verfügbaren Klassen betrachten. Wenn Sie nicht wissen, wo Sie anfangen sollen, beginnen Sie mit etwas wie NSString. Sie werden mit den Details der übergeordneten Klasse, den Methoden usw. vertraut. Dies wird später wichtig sein, wenn Sie Klassen außerhalb dieser Reihe verwenden und wissen möchten, welche Methoden sie erben oder verwenden.
Wir werden nächste Woche mit ein wenig Programmcode praktischer werden. Der Unterricht ist für Objective-C von zentraler Bedeutung. Daher ist es äußerst wichtig, dass Sie sich mit ihnen auseinandersetzen. Das Ziel dieser Serie ist es, wirklich sicherzustellen, dass Sie dies tun!
Wenn Sie Fragen oder Kommentare haben, können Sie mich wie gewohnt erreichen, indem Sie einen Kommentar oder eine E-Mail löschen. Wenn Sie sich persönlich mit mir in Verbindung setzen und eine schnelle Antwort erhalten möchten, senden Sie mir einen Tweet!