Я считаю, что вы ищете NSGetSizeAndAlignment
:
Получает фактический размер и выровненный размер закодированный тип.
const char * NSGetSizeAndAlignment (
const char *typePtr,
NSUInteger *sizep,
NSUInteger *alignp
);
Обсуждение
Получает фактический размер и выровненный размер первого типа данных, представленного typePtr
и возвращает указатель на позицию следующего типа данных в typePtr
.
Это функция фонда, а не часть базового времени выполнения, что, вероятно, поэтому не нашло его.
UPDATE: Хотя первоначально не говоря уже о том, что вы используете Cocotron, он также доступен здесь. Вы можете найти его в Фонде Кокотрона, в NSObjCRuntime.m.
Очевидно, что это намного лучше, чем опрокидывание собственного, поскольку вы можете доверять ему, чтобы всегда правильно обрабатывать строки, созданные его собственной средой выполнения, в маловероятном случае, когда символы кодировки должны измениться.
По какой-то причине, однако, он не может обрабатывать цифровые элементы строки подписи метода (которая, по-видимому, имеет что-то делать с смещениями в памяти). This improved version, by Mike Ash будет делать это:
static const char *SizeAndAlignment(const char *str, NSUInteger *sizep, NSUInteger *alignp, int *len)
{
const char *out = NSGetSizeAndAlignment(str, sizep, alignp);
if(len)
*len = out - str;
while(isdigit(*out))
out++;
return out;
}
Итак, ответ: нет способа сделать это, не реализуя его самостоятельно. Верный? –
@Tilo Я сделал некоторые глупые вещи со временем выполнения - нет бесплатного решения, о котором я знаю, но решение в моем ответе может быть реализовано довольно легко, если вы знаете типы, которые вы должны поддерживать. Конечно, вы также можете подождать и посмотреть, если вы получите более подходящий ответ. – justin
@Tilo - добавлено демо для этого – justin