afaik, necesitarás hornear esa información en tu binario. simplemente cree una función que devuelva el tamaño de y alinee en una estructura, admite los tipos que debe soportar y luego llame a esa función (o método de clase) para la información.
El siguiente programa muestra que muchas de las primitivas son solo un carácter. Entonces, la mayor parte de la implementación de la función podría ser un cambio.
static void test(SEL sel) {
Method method = class_getInstanceMethod([NSString class], sel);
const char* const type = method_copyReturnType(method);
printf("%s : %s\n", NSStringFromSelector(sel).UTF8String, type);
free((void*)type);
}
int main(int argc, char *argv[]) {
@autoreleasepool {
test(@selector(init));
test(@selector(superclass));
test(@selector(isEqual:));
test(@selector(length));
return 0;
}
}
y, a continuación, podría utilizar esto como un punto de partida:
typedef struct t_pair_alignof_sizeof {
size_t align;
size_t size;
} t_pair_alignof_sizeof;
static t_pair_alignof_sizeof MakeAlignOfSizeOf(size_t align, size_t size) {
t_pair_alignof_sizeof ret = {align, size};
return ret;
}
static t_pair_alignof_sizeof test2(SEL sel) {
Method method = class_getInstanceMethod([NSString class], sel);
const char* const type = method_copyReturnType(method);
const size_t length = strlen(type);
if (1U == length) {
switch (type[0]) {
case '@' :
return MakeAlignOfSizeOf(__alignof__(id), sizeof(id));
case '#' :
return MakeAlignOfSizeOf(__alignof__(Class), sizeof(Class));
case 'c' :
return MakeAlignOfSizeOf(__alignof__(signed char), sizeof(signed char));
...
Así que la respuesta es: No hay forma de hacerlo sin implementarlo yo solo. ¿Correcto? –
@Tilo He hecho algunas tonterías con el tiempo de ejecución, no hay una solución gratuita que yo sepa, pero la solución en mi respuesta puede implementarse bastante fácilmente si conoce los tipos que debe admitir. Por supuesto, también puede esperar y ver si obtiene una respuesta más adecuada. – justin
@Tilo - agregué una demostración para este – justin