2012-05-14 47 views
6

Estoy tratando de usar un NSInvocation para invocar un método de superclase de la subclase. El código en cuestión es relativamente sencillo, va así:iOS: ¿No se puede usar 'super' como referencia?

- (NSInvocation*) invocationWithSelector:(SEL)selector { 
    NSInvocation* call = [[NSInvocation alloc] init]; 
    [call retainArguments]; 
    call.target = super; //ERROR: use of undeclared identifier 'super' 

    call.selector = @selector(selector); 

    return call; 
} 

Esto parece un poco extraño para mí, ya que siempre había asumido que super siguieron más o menos las mismas reglas que self (es decir, que podrían ser tratados como una directa referencia al objeto en cuestión y asignado a variables, usado como un valor de retorno, etc.). Parece que este no es el caso en la práctica.

De todos modos, ¿hay alguna forma sencilla de obtener mi NSInvocation para apuntar la implementación de la superclase (no puedo usar self como el objetivo, debido a que la subclase sobreescribe los métodos de superclase), o necesito a buscar algún otro enfoque?

+0

funciona selfsuperclass? (solo adivinando aquí ...) – Pochi

Respuesta

9

Consulte What exactly is super in Objective-C? para obtener más información, pero super no es en realidad un objeto. Super es una palabra clave para que el compilador genere llamadas en tiempo de ejecución obj-c (específicamente objc_msgSendSuper). Básicamente, es como lanzar tu clase a su superclase antes de enviar el mensaje.

EDIT Si ha anulado el método que desea llamar, tendrá que escribir otro método para llamar a [supermétodo] directamente y configurar su invocación para llamar a ese método. El tiempo de ejecución solo enviará mensajes a objetos, y se tratarán en el miembro más bajo de la cadena de herencia que los implemente.

+0

Interesante, entonces esencialmente no se puede invocar indirectamente un método de superclase usando 'NSInvocation' o' performSelector ... 'si su subclase proporciona su propia implementación del método de destino? Eso parece una pequeña limitación. – aroth

+0

¿Lo tiene? ¿C++ u otro lenguaje basado en C te permiten hacer esto? Es decir, si anulas la funcionalidad, significa que quieres un comportamiento en tu clase que sea diferente del de su clase principal (o además del de su clase principal). Si esta no es la idea correcta, entonces supongo que tengo un defecto fundamental en mi comprensión de OOP. – borrrden

+0

No, no parece que otros lenguajes lo permitan (lo intenté con Java, el mismo problema). Pero aciertes el punto clave con tu comentario "además del de su clase principal". La subclase tiene la capacidad de invocar explícitamente la implementación de superclase de un método reemplazado, como debería ser. Y por eso no veo ninguna razón lógica por la que no pueda hacer lo mismo implícitamente con una llamada 'NSInvocation' o' performSelector ... '. En resumen, no creo que tenga sentido que las llamadas a la implementación de superclase requieran una invocación explícita/inmediata. – aroth

1

super y self son el mismo objeto, por lo que sólo tiene que utilizar

call.target = self; 

La diferencia entre ellos es que se puede utilizar super como receptor de un mensaje a self como una manera de asegurar que se invoca la superclase 'implementación.

+0

¿Quisiste escribir "self"? – borrrden

Cuestiones relacionadas