2009-10-08 17 views
5

Necesito construir un NSMethodSignature arbitrario con "signatureWithObjCTypes:" en Cocoa sin tener un objeto que pueda solicitar una firma con "methodSignatureForSelector:".Obtención de codificaciones de tipo para las firmas de métodos en Cocoa/Objective-C?

Para esto, necesito la codificación del método, que p. es

[email protected]:[email protected] 

para

(BOOL) isEqual: (id) object 

Probé @encode (...) para obtener un tipo de codificación, pero esto no parece funcionar para las funciones (que da lugar a un tipo desconocido '?') No quiero codificar manualmente el tipo de función, ya que no es portátil en diferentes tiempos de ejecución.

Tampoco hay un método declarado para obtener la codificación.

¿Hay alguna otra forma de obtener la codificación?

Saludos,

Jochen

Respuesta

0

Lo que no sólo funcionan si se utiliza el tipo de codificación desconocida?

? | Un tipo desconocido (entre otras cosas, este código se utiliza para los punteros a las funciones)

AFAIK no debería importar porque es casi del tamaño del argumento. Los punteros de función tienen el mismo tamaño que el argumento estándar que es un int.

+0

Desafortunadamente esto no funciona, ya que necesito el método de codificación completa para llamar signatureWithObjCTypes de NSMethodSignature: – Jochen

12

¿Qué pasa algo como:

#import <objc/runtime.h> 
//inside the method implementation: 
Method thisMethod = class_getClassMethod([self class], _cmd); 
const char * encoding = method_getTypeEncoding(thisMethod); 

O por un método arbitrario:

#import <objc/runtime.h> 
//inside the method implementation: 
Method thisMethod = class_getClassMethod([self class], @selector(isEqual:)); 
const char * encoding = method_getTypeEncoding(thisMethod); 
+1

Esta es la forma en Lo resolví por el momento, pero realmente necesito una solución que funcione sin tener un método declarado para obtener la codificación. Algo como @encode (id (id, SEL, int)) que no devuelve '?'. – Jochen

+1

@Jochen: ¿qué hay de '[[NSString stringWithFormat: @"% s% s% s% s ", @encode (id), @encode (id), @encode (SEL), @encode (int)] UTF8String] ' – user102008

Cuestiones relacionadas