Я считаю, что вы ищете NSGetSizeAndAlignment
:
Получает фактический размер и выровненный размер закодированного типа.
const char * NSGetSizeAndAlignment (
const char *typePtr,
NSUInteger *sizep,
NSUInteger *alignp
);
Обсуждение
Получает фактический размер и выровненный размер первого типа данных, представленного typePtr
, и возвращает указатель на позицию следующего типа данных в typePtr
.
Это базовая функция, а не часть базовой среды выполнения, поэтому, вероятно, вы ее не нашли.
ОБНОВЛЕНИЕ: Хотя вы изначально не упоминали, что используете Cocotron, он также доступен там.Вы можете найти его в Cocotron's Foundation, в NSObjCRuntime.m .
Очевидно, это намного лучше, чем собственный, так как вы можете доверять ему всегда правильно обрабатывать строки, сгенерированные его собственнойвремя выполнения в маловероятном случае, когда символы кодирования должны измениться.
По какой-то причине, однако, он не может обрабатывать цифровые элементы строки сигнатуры метода (которые предположительно имеют отношение к смещениям в памяти). Эта улучшенная версия от 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;
}