Por lo que tengo entendido, Objective C/iOS es un lenguaje muy dinámico, ¿es tan dinámico como Ruby? ¿Tiene el equivalente de method_missing? Hice la misma pregunta para js Does Javascript have something like Ruby's method_missing feature? y me decepcionó que js todavía no lo admita.Equivalente a Ruby method_missing en Objective C/iOS
Respuesta
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
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");
'respondsToSelector:' en Objective-C corresponde a 'responder_a?' En Ruby, no 'method_missing'. – louielouie
El tuyo parece más simple que louielouie ¿cuál es la diferencia porque no soy capaz de juzgar como novato gracias :) – user310291
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. –
he implementado este patrón basado en el ejemplo de la adición de los mismos métodos a una subclase UITextField
y UITextView
: https://stackoverflow.com/a/19661059/171933
¡Disfrútalo!
- 1. equivalente en Python de 'method_missing' de Ruby
- 2. method_missing gotchas en Ruby
- 3. ¿Ruby tiene un method_missing equivalente para variables de instancia indefinidas?
- 4. Equivalente a "continuar" en Ruby
- 5. Objective-C equivalente a "anular" en C#
- 6. ¿Tiene Javascript algo como la función method_missing de Ruby?
- 7. Ruby equivalente a PHP $ this
- 8. Equivalente a Ruby Enumerable # each_slice en Javascript?
- 9. MonoTouch.Dialog equivalente para Objective C?
- 10. Equivalente de Sscanf en Objective-C
- 11. Ruby equivalente a la ayuda de Python()?
- 12. ¿Tiene Ruby/Rails un equivalente a ++?
- 13. Python Equivalente a #each_cons de Ruby?
- 14. Python equivalente a cada_slice de Ruby (conteo)
- 15. ruby / rails equivalente a javascript decodeURIComponent?
- 16. equivalente constructor estático en Objective-C?
- 17. equivalente AES en Ruby openssl?
- 18. Método de clase en Ruby (equivalente a static en JAVA)
- 19. Ruby equivalente de NumPy
- 20. Cómo averiguar lo que está interceptando '' method_missing
- 21. Ruby "es" equivalente
- 22. Carga dinámica de clases: ¿hay un "method_missing" para las clases en Ruby?
- 23. ¿Tiene Ruby un equivalente a TimeSpan en C#?
- 24. Cuál es el equivalente a "Método de referencia" en Ruby
- 25. `if __name__ == '__main __'` equivalente en Ruby
- 26. Python equivalente de Perl/Ruby || =
- 27. ¿Qué es el equivalente "sys.stdout.write()" en Ruby?
- 28. Ruby equivalente de Python setattr()
- 29. C# equivalente al símbolo Ruby
- 30. equivalente en Objective C de MessageDigest en Java?
+1 para una respuesta perfecta. – Vignesh
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. –