afaik, dovrai inserire le informazioni nel tuo file binario. basta creare una funzione che restituisce la dimensione e l'allineamento in una struttura, supporta i tipi che è necessario supportare, quindi chiama tale funzione (o metodo di classe) per le informazioni.
Il programma seguente mostra che molti dei primitivi sono solo un carattere. Quindi la maggior parte dell'implementazione della funzione potrebbe essere un cambiamento.
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;
}
}
e si potrebbe quindi utilizzare questo come punto di partenza:
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));
...
Quindi la risposta è: non c'è modo di farlo senza implementarlo da solo. Corretta? –
@Tilo Ho fatto alcune cose stupide con il runtime - non c'è alcuna soluzione gratuita che io conosca, ma la soluzione nella mia risposta può essere implementata abbastanza facilmente se si conoscono i tipi che si devono supportare. Certo, puoi anche aspettare e vedere se ottieni una risposta più appropriata. – justin
@Tilo - aggiunta una demo per questo – justin