Estoy tratando de subclasificar una cierta clase y anular algunos de sus métodos privados. Esto es peligroso, podría fallar, no podría pasar la revisión de Apple (en la AppStore), podría tener efectos terribles, etc., pero esto es solo para propósitos experimentales/educativos :)Obteniendo el tipo de argumento en un método
Por ejemplo, digamos que quiero saber el tipo del primer argumento del método de instancia keyboardInput:shouldInsertText:isMarkedText:
de UITextView
:
SEL selector = @selector(keyboardInput:shouldInsertText:isMarkedText:);
Class class = [UITextView class];
Method method = class_getInstanceMethod(class, selector);
char *arg = method_copyArgumentType(method, 0);
printf("_%s_\n", arg);
free(arg);
Sin embargo, en la consola solo me dan [email protected]_
. Creo que @
significa objeto pero ¿un objeto de qué clase? (Pensé que obtendría el nombre de la clase del argumento) ¿Es posible obtener la clase de ese parámetro utilizando otro objective-c runtime functions o cualquier otro medio?
PD: En el ejemplo utilicé una clase de toque Cocoa, pero podría haber intentado exactamente lo mismo con una clase de Cocoa. Entonces esto no debería ser específico para iOS.
resuelto:
que he probado en el simulador de lo que Dave sugirió, funcionó!
(gdb) info all-registers
me dio una larga lista de valores, ...
((gdb) po *(id*)($ebp + 8)
<MyTextView: 0x5911270; baseClass = UITextView; frame = (80 70; 240 323); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x5c0c7d0>; contentOffset: {0, 0}>
(gdb) p *(SEL*)($ebp + 12)
$5 = (SEL) 0xbd19
(gdb) po *(id*)($ebp + 16)
<UIWebDocumentView: 0xa02f000; frame = (0 0; 240 457); text = 'Lorem ipsum dolor sit er ...'; opaque = NO; userInteractionEnabled = NO; layer = <UIWebLayer: 0x5c35070>>
(gdb) po *(id*)($ebp + 20)
t
(gdb) p *(id*)($ebp + 24)
$6 = (id) 0x0
lo cual tiene sentido ya que la clave Presioné era una sola "t" por lo que no estaba marcado de texto ("0x0") por lo que está bien pensar que el primer argumento debería ser del tipo UIWebDocumentView
.
Solo una pequeña cosa (irrelevante en este caso), ¿cómo podría obtener el nombre del método de un SEL en gbd? por ejemplo $5
?
El 'SEL' * es * el nombre del método. Use la función 'sel_getName' para obtener el selector como una cadena C; ver también http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/. También hay 'NSStringFromSelector', que hace exactamente lo que dice, y es parte de (y documentada en) Foundation. –