为了和运行时系统协作,编译器将方法的返回类型和参数类型都编码成一个字符串,并和方法_cmd关联。我们可以通过给定一个类型,使用@encode() 编译指令来获得具体的编码。类型可以使基本类型,指针,结构体,联合体,类。
编码 含义
c A char
i An int
s A shot
l A long
q A long long
C An unsigned char
I An unsigned int
S An unsigned short
L An unsigned long
Q An unsigned long long
f A float
d A double
B C++ 标准的bool 或者 C99标准的 _Bool
v A void
* A character string (char *)
@ 对象(无论是静态指定的还是通过id引用的)
# 类(class)
: 方法符号_cmd (SEL)
? A unknown type (其他时候,一般指函数指针)
[array type] 数组 eg:[12^f] 代表一个12个浮点数指针的数组
{name=type...} 结构体
eg:结构体
typedef struct example{
id anObject;
char *aString;
int anInt;
}Example;
编码是:{example=@*i}
(name=type...) 联合体
bnum num 个bit的位域
^type type类型的指针
注意:Object-C不支持long double类型,@encode(long double)和double一样,返回的字符串都是d
尽管有一些编码无法从@encode()的结果中直接得到,但是运行时系统会使用他们来表示协议类中方法的修饰符,如表
网友评论