2012-08-06 8 views
6

Ich erwartete [super class], um die Klasse der Oberklasse zurückzugeben, jedoch habe ich gefunden, mit diesem Code, der diese Klasse Klasse zurückgibt.Warum ist "[Selbst Klasse] == [Super Klasse]"?

-Code

NSLogObject([self class]); 
NSLogObject([super class]); 
NSLogObject([self superclass]); 
NSLogBool([self class] == [super class]); 

Ausgabe

[self class]: MainMenuScene 
[super class]: MainMenuScene 
[self superclass]: CCScene 
[self class] == [super class]:[YES] 

Kann jemand erklären, warum dies geschieht bitte ?. Ich erwarte, dass es denselben Wert wie [self superclass] zurückgibt.

Macros: 
------- 
#define NSLogBool(i) NSLog(@"%s:[%@]", #i, (i) ? @"YES" : @"NO") 
#define NSLogObject(o) NSLog(@"%s:[%@]", #o, o) 
+2

Und nur wenn ich nicht genug "Klasse" gesagt habe: "Class Class Class Class Class!" –

+0

Sie sollten Apple-Präfixe nicht in Ihren eigenen Klassen oder Makros (oder nur irgendeinen anderen Bezeichner) verwenden. – JustSid

+1

Ich sollte, wenn ich möchte, dass sie erscheinen, wenn ich NSLog gebe ...: P –

Antwort

6

[super class] aufruft super die Methode auf der aktuellen Instanz (d.h. self). Wenn self eine überschriebene Version hätte, würde sie aufgerufen werden und sie würde anders aussehen. Da Sie es nicht überschreiben, ist das Aufrufen von [self class] das gleiche wie das Aufrufen von [super class].

+0

Danke. Ich bin nur schäbig und nehme an, dass eine Methode namens "Klasse" sich irgendwie anders verhalten sollte als der Rest von oop! –

+0

Ich gebe zu, ich fiel in die gleiche Falle für eine Sekunde beim Lesen Ihrer Frage. Keine Bange. – mprivat

+1

auch wenn Sie es nicht überschrieben haben, ist es möglich, dass '[self class]' nicht dasselbe ist wie '[super class]', wenn 'self' eine Instanz einer Unterklasse ist, die die Methode überschreibt; dann würde es die Implementierung dieser Unterklasse – newacct

2

super bezieht sich auf die Methodenimplementierung in der Oberklasse. Wenn Sie die Methode in Ihrer Klasse nicht überschreiben, ist die Implementierung in Ihrer Klasse und ihrer Oberklasse identisch.

Sowohl [super class] als auch [self class] rufen die gleiche Methode auf, definiert unter NSObject.

+1

selbst wenn Sie es nicht überschrieben haben, ist es möglich, dass '[self class]' nicht dasselbe ist wie '[super class]', wenn 'self' eine Instanz einer Unterklasse ist, die die Methode überschreibt; dann würde es die Implementierung dieser Unterklasse – newacct

+0

@newacct Ich weiß. – Sulthan

0

Während die Antworten von mprivat und Sulthan technisch korrekt sind, ist der aktuelle Fall etwas komplizierter (und interessant):

Unter Berücksichtigung der Umsetzung der Aufruf der Methode. Es verwendet (natürlich) den Objektzeiger. Ein Objektzeiger ist ein Zeiger auf eine Struktur, die als erstes Element (isa) einen Zeiger auf die Objektklasse hat. Die class Methoden (das heißt, wie mprivat und Sulthan korrekt angegeben haben, genau dasselbe in beiden Fällen) folgt diesem Zeiger, um die Klasse zu bestimmen, d.h. immer die Klasse des aufrufenden Objekts.

Als Ergebnis, wenn A die Superklasse von B, beide Anrufe [self class] und [super class] durch eine Instanz von B genannt, kehren die Klasse B (nicht von A, was man wegen einer fehlenden Überschreibung erwarten kann!).

Verwandte Themen