Atrapar un mensaje indefinido en OBJC y reenviarlo a un método con una firma diferente

StackOverflow https://stackoverflow.com/questions/6816034

  •  25-10-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una clase de registrador (¿quién no?) Con un método

- (void) logWithTag:(NSString *)aTag andMessage:(NSString *)aMsg;

Deseo poder reenviar mensajes indefinidos a este método. Por ejemplo :

[myLogger logFoo:@"bar"] should call [myLogger logWithTag:@"Foo" andMessage:@"bar"]

y más genéricamente

[myLogger logXXX:@"bar"] should call [myLogger logWithTag:@"XXX" andMessage:@"bar"]

He mirado resolveInstanceMethod y reenvío de mensajes, pero por lo que entendí, todos esperan que el método tenga la misma firma.

Alguna idea ? Gracias !

¿Fue útil?

Solución

Apple cubre esto en el Objective-C Runtime Programming Guide. Básicamente necesitas anular respondsToSelector: y devuelva sí si desea admitir el método. Entonces también anular forwardInvocation: y luego capture la cadena del selector, elimine el prefijo de registro y cree un nuevo NSInvocation que llamará logWithTag:andMessage:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top