如何从objective-c类型编码中获取字节大小

时间:2012-08-31 07:10:46

标签: objective-c reflection

使用NSMethodSignature我可以通过getArgumentTypeAtIndex获取方法参数类型:它返回一个基于this documentation.的c-string,所以像“i”表示int,“I”表示unsigned。

是否有某个函数接受此编码并以字节为单位返回类型大小?

这样的事情:

int paramSize = typeEncodingSize("i");
NSLog(@"%s is %d bytes", "i", paramSize);
//this would be the encoding for a struct that has three fields. An id, a pointer and an int.
paramSize = typeEncodingSize("{example=@*i}"); //two 8 byte pointers & one 4 byte int
NSLog(@"%s is %d bytes", "{example=@*i}", paramSize); 

which would output: 
i is 4 bytes
{example=@*i} is 20 bytes

我认为自docs for [NSInvocation setArgument:atIndex:]

以来必须有一个api函数
  

复制的字节数由参数大小决定。

3 个答案:

答案 0 :(得分:0)

你试过sizeof()吗?这是确定结构或其他类型大小的常用方法。

答案 1 :(得分:0)

Caleb的sizeof()是正确的,因为基本上只有当@encode接受sizeof()时,您才能将任何内容传递给@decode。比如CDTypeParser.m。您可以下载class-dump源代码并查看{{1}}文件,例如如何解析它。

答案 2 :(得分:0)

我知道这已经过时了,但我已经撞到了同一堵墙。

解决方案似乎是方法NSGetSizeAndAlignment

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/#//apple_ref/c/func/NSGetSizeAndAlignment