[self class]
ist nicht speziell vom Compiler behandelt. Es ist eine normale Nachricht senden.
ein Objekt in Objective-C auf Apple-Plattformen Constructing sieht wie folgt aus:
UIView *view = [[UIView alloc] init];
zwei Schritten Es gibt: alloc
und init
.
Zuerst weisen Sie den Heapspeicher des Objekts zu, indem Sie die Nachricht alloc
an das Klassenobjekt senden. Fast alle Klassenobjekte erben einfach die alloc
Methode von NSObject
. Diese Methode weist den Heapspeicher unter Verwendung von malloc
(oder ähnlichem) zu, füllt den Speicher mit Nullen und setzt die Instanzvariable isa
des Objekts auf sich selbst (das Klassenobjekt, das die Methode alloc
empfangen hat).
Zweitens, Sie bitten das neu erstellte Objekt, sich selbst zu initialisieren, indem Sie es eine init
Nachricht senden. Im Gegensatz zu alloc
wird init
sehr oft außer Kraft gesetzt, oder Klassen bieten eine klassenspezifische Initialisierungsmeldung (wie Ihre initWithBlah:
).
Zu der Zeit, eine Aufgabe, eine init
-Typ Nachricht hat, sein isa
Instanz-Variable erhält bereits bei seiner Klasse Objekt zu zeigen und alle anderen Instanzen Variablen wurde auf Null gesetzt worden.
Wenn ein normales Objekt eine Nachricht class
empfängt, gibt es einfach die Klasse zurück, auf die seine isa
verweist.
Ich bin hier vereinfacht, weil die moderne Objective-C-Laufzeit etwas “non-pointer isa” genannt unterstützt, wo andere Dinge im isa
Feld neben dem Klassenzeiger codiert werden, so dass die class
Methode ein wenig mehr Arbeit zu tun hat Holen Sie den Klassenzeiger aus dem Feld. Aber das Feld isa
wird immer noch von alloc
initialisiert.
Es gibt auch etwas namens tagged pointers, in dem die Klasse des Objekts direkt in die Objektreferenz eingebettet ist. Für diese Objekte funktioniert class
anders, aber nur eine kleine Anzahl von Systemklassen verwendet markierte Zeiger, so dass markierte Zeiger niemals die Art beeinflussen, wie class
für Ihre eigenen benutzerdefinierten Klassen funktioniert.