2012-08-06 31 views
6

Mi aspettavo [super class] per restituire la classe della superclasse, tuttavia ho trovato, utilizzando questo codice che restituisce la classe di questa classe.Perché "[auto classe] == [super classe]"?

Codice

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

uscita

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

Qualcuno può spiegare perché questo accade prego ?. Mi aspetto che restituisca lo stesso valore di [self superclass].

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

E in caso contrario non ho detto abbastanza "classe": "Classe classe classe classe!" –

+0

Non si dovrebbero usare i prefissi Apple nelle proprie classi o macro (o semplicemente qualsiasi altro identificatore) – JustSid

+1

Dovrei farlo se voglio che vengano visualizzati quando digito NSLog ...: P –

risposta

6

[super class] chiama il metodo super sulla istanza corrente (cioè self). Se il self avesse una versione sovrascritta, sarebbe chiamata e sarebbe diversa. Dal momento che non lo sostituisci, chiamare [self class] equivale a chiamare [super class].

+0

Grazie. Sto solo facendo il bagno e supponendo che un metodo chiamato "classe" debba in qualche modo comportarsi in modo diverso dal resto di oop! –

+0

Ammetto che sono caduto nella stessa trappola per un secondo mentre leggevo la tua domanda. Nessun problema. – mprivat

+1

anche se non l'hai sovrascritto, è possibile che '[auto classe]' non sia lo stesso di '[super classe]', se 'self' è un'istanza di una sottoclasse che sovrascrive il metodo; quindi chiamerebbe l'implementazione della sottoclasse – newacct

2

super si riferisce all'implementazione del metodo nella superclasse. Se non si esegue l'override del metodo nella classe, l'implementazione nella classe e nella relativa superclasse è la stessa.

Entrambi [super class] e [self class] chiamare lo stesso metodo, definito su NSObject.

+1

anche se non l'hai sovrascritto, è possibile che '[self class]' non sia lo stesso di '[super-classe]', se 'self' è un'istanza di una sottoclasse che sovrascrive il metodo; quindi chiamerebbe l'implementazione della sottoclasse – newacct

+0

@newacct che conosco. – Sulthan

0

Mentre le risposte per mprivat e Sulthan sono tecnicamente corrette, il caso attuale è un po 'più complicato (e interessante):

Considerando l'attuazione della chiamata al metodo. Usa (ovviamente) il puntatore dell'oggetto. Un puntatore a oggetti è un puntatore a una struttura che ha come primo elemento (isa) un puntatore alla classe di oggetti. I metodi class (vale a dire, come mprivat e Sulthan hanno dichiarato correttamente, lo stesso in entrambi i casi) seguono questo puntatore per determinare la classe, ovvero, sempre la classe dell'oggetto chiamante.

Di conseguenza, se A è la superclasse di B, entrambe le chiamate [self class] e [super class] chiamati da un'istanza di B, riportare la classe di B (non di A, che cosa ci si può aspettare a causa di una sostituzione mancante!).

Problemi correlati