2012-08-06 18 views
6

Esperaba que [super class] devolviera la clase de la superclase, sin embargo, encontré, usando este código, que devuelve la clase de esta clase.¿Por qué "[self class] == [super class]"?

Código

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

salida

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

Puede alguien explicar por qué esto sucede por favor ?. Espero que devuelva el mismo valor que [self superclass].

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

Y solo en caso de que no dijera "clase" suficiente: "¡Clase class class class class!" –

+0

No debe usar prefijos de manzana en sus propias clases o macros (o cualquier otro identificador) – JustSid

+1

Debería si deseo que aparezcan cuando escribo NSLog ...: P –

Respuesta

6

[super class] llama al método super en la instancia actual (es decir self). Si self tuviera una versión anulada, se llamaría y se vería diferente. Como no lo anula, llamar al [self class] es lo mismo que llamar al [super class].

+0

Gracias. ¡Solo estoy siendo dozy y supongo que un método llamado "clase" debería de alguna manera actuar de manera diferente al resto de oop! –

+0

Admito que caí en la misma trampa por un segundo mientras leía su pregunta. Sin preocupaciones. – mprivat

+1

incluso si no lo anuló, es posible que '[self class]' no sea lo mismo que '[superclase]', si 'self' es una instancia de una subclase que anula el método; entonces llamaría a la implementación de esa subclase – newacct

2

super se refiere a la implementación del método en la superclase. Si no anula el método en su clase, la implementación en su clase y su superclase es la misma.

Ambos [super class] y [self class] llaman al mismo método, definido en NSObject.

+1

incluso si no lo anuló, es posible que '[self class]' no sea lo mismo que '[super clase]', si 'self' es una instancia de una subclase que anula el método; entonces llamaría a la implementación de esa subclase – newacct

+0

@newacct Lo sé. – Sulthan

0

Mientras que las respuestas de los mprivat y Sulthan son técnicamente correcto, el caso actual es un poco más complicada (e interesante):

Teniendo en cuenta la aplicación de la llamada al método. Utiliza (por supuesto) el puntero del objeto. Un puntero de objeto es un puntero a una estructura que tiene como primer elemento (isa) es un puntero a la clase de objetos. Los métodos class (es decir, como mprivat y Sulthan han indicado correctamente, el mismo en ambos casos) siguen este puntero para determinar la clase, es decir, siempre la clase del objeto que llama.

Como resultado, si A es la superclase de B, ambas llamadas [self class] y [super class] llamado por una instancia de B, devolver la clase de B (no de A, lo que uno puede esperar debido a una anulación que falta!)

Cuestiones relacionadas