2017-03-16 1 views
1

ich über einige Code lief heute, die die folgenden:Ist [self-Klasse] Sonder in Objective-C

- (instancetype)initWithBlah:(Blah)blah { 
    NSLog(@"Initialising instance of %@", [self class]); 

    if ((self = [super init]) != nil) { 
    // blargh 
    } 
    return self; 
} 

Nun, dies scheint seltsam, weil selbst in [self class] verwendet wird, bevor es später tatsächlich ein paar Zeilen-Set , scheint aber nie hier zu stürzen und der Compiler quietscht nicht, und es funktioniert tatsächlich.

Wird [self class] speziell vom Objc-Compiler behandelt und nur statisch zum Klassenobjekt ausgewertet?

Antwort

4

Nein. Nichts Besonderes.

self ist tatsächlich auf Eintrag in den Körper der Methode festgelegt. Aber [super initkönnte eine andere Instanz zurückgeben, daher die Neuzuweisung. Also, technisch, konnte diese Protokollanweisung Protokoll etwas, das nicht mehr wahr am Ende des Initialisierers ist.

Sie werden wahrscheinlich diese lesen wollen:

Why [object doSomething] and not [*object doSomething]?

6

[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.

Verwandte Themen