2012-03-21 12 views

Respuesta

16

Objective-C es dinámica, a pesar de haber sido un programador Ruby, yo diría que no es tan dinámica como Ruby.

Objective-C tiene un equivalente de method_missing. Usted querrá anular tanto forwardInvocation: y methodSignatureForSelector: y seguir este importante consejo de Apple:

Importante Para responder a los métodos que su objeto no reconoce en sí, debe invalidar methodSignatureForSelector: además de forwardInvocation :. El mecanismo para reenviar mensajes utiliza información obtenida de methodSignatureForSelector: para crear el objeto NSInvocation que se reenviará. Su método principal debe proporcionar una firma de método apropiada para el selector dado, ya sea preformulando uno o preguntando a otro objeto por uno.

No utilice doesNotRecognizeSelector: ya que Apple advierte que it must always result in an exception being thrown.

Por favor, ver la documentación de la clase NSObject para más detalles: http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

+0

+1 para una respuesta perfecta. – Vignesh

+1

Consulte también la sección sobre [Reenvío de mensajes] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048- CH105) en la Guía de tiempo de ejecución de Objective-C. –

-1

Creo que method_missing es un método de devolución de llamada que se invoca cuando un objeto no tiene un método determinado. Bueno, puedes usar el método respondsToSelector para verificar si un objeto puede responder a un método. Es un método declarado en el protocolo NSObject. Entonces, en lugar de llamar a method_missing después de darse cuenta de que falta algún método, puedes verificarlo con anterioridad.

if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)]) 
    NSLog(@"The method is missing"); 
+0

'respondsToSelector:' en Objective-C corresponde a 'responder_a?' En Ruby, no 'method_missing'. – louielouie

+0

El tuyo parece más simple que louielouie ¿cuál es la diferencia porque no soy capaz de juzgar como novato gracias :) – user310291

+0

El que sugerí te ayuda a comprobar si un objeto puede responder a un método. En su mayoría, querrá utilizar este método cuando sospeche que un objeto puede no responder a un método, es una especie de precaución. Si un objeto o su predecesor (es) no tienen dicho método, su programa se bloqueará. Pero llamar a un método solo con la condición de que el objeto responda impedirá que su programa falle. El método method_missing, por lo que yo entiendo, es un método que se llama cuando ocurre una situación de este tipo y no deja que el programa se cuelgue. Por lo tanto, el primero es para chequear y el segundo es para manejar un caso. –

Cuestiones relacionadas