2011-07-25 24 views
5

estoy tratando este método se encuentra en Obj-c runtime referencemétodos añadiendo dinámicamente

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) 

Quiero añadir un nuevo método como:

- [AClass drawWithFrame:(NSRect)rect inView:(id)view] 

Hasta ahora he escrito una función C:

void drawWithFrameInView(id this, SEL this_cmd, NSRect frame, id view){ 
... 
} 

ahora estoy listo para hacer:

BOOL success = class_addMethod(NSClassFromString(@"AClass"), 
           @selector(drawWithFrame:inView:), 
           (IMP)drawWithFrameInView, 
           "[email protected]:@:@:"); 

pero success nunca es SÍ, he intentado el mismo enfoque con métodos con firmas más simples y funcionó. Así que creo que el problema es el último parámetro: "[email protected]:@:@:"

¿Qué debo pasar en este caso para que funcione mi nuevo método?

+0

¿Por qué no nombrar los dos primeros argumentos 'self' y' _cmd', para que pueda escribir el mismo código que habría escrito en un método? –

+0

Hummm ... solo por una razón estética. Desde el punto de vista de C, se supone que 'self' y' _cmd' son parámetros normales. No me gustó el hecho de que un parámetro se coloreara como palabras clave en Obj-C (a pesar de que representan esas palabras clave). Eso es todo :) – nacho4d

Respuesta

8

Esto funcionará:

char *types = [[NSString stringWithFormat:@"[email protected]:%[email protected]", @encode(NSRect)] UTF8String]; 

BOOL success = class_addMethod(NSClassFromString(@"MyClass"), 
           @selector(drawWithFrame:inView:), 
           (IMP)drawWithFrameInView, 
           types); 

La razón por la que su código no funciona es porque es NSRectno un objeto, es un typedef a un struct.

Más información sobre las codificaciones de tipo here.

+0

Eso parece funcionar (al menos tuve éxito = SÍ :)). Sin embargo, los documentos dicen: * Dado que la función debe tomar al menos dos argumentos: self y _cmd, el segundo y tercer caracteres deben ser "@:" (el primer carácter es el tipo de retorno) * y 'types' no contiene un retorno tipo, ¿es esto porque está 'vacío' o hay algún tipo de inferencia aquí? – nacho4d

+0

@ nacho4d 'types' *** does *** contiene un tipo de devolución - el primer elemento es' 'v'', para 'void'. –

+0

¡Gracias !, ahora veo el 'v' bastante claro :) – nacho4d

Cuestiones relacionadas