为了与运行时系统(runtime system)协作,编译器用字符串的形式编码方法选择器的返回值和参数类型。这种编码方式在其他情况下也很有用,所以就有了@encode()这个编译器指令。@encode通过字符串的形式表示类型,可以是表示基本类型int、指针、结构体(tagged structure?)、联合或者是类名—包括所有可以用做C运算符sizeof()参数的类型。
char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);
下表列出了一些类型编码
注意:Objective-C 不支持 long double 类型。@encode(long double) 返回 d(double的编码)
数组类型的编码是用方括号括起来的;紧邻左括号的数字代表着数组的元素个数,后面的是数组类型。例如,一个拥有12个float型元素的数组将被如下编译
[12^f]
结构体用大括号,联合用小括号表示。结构体的标签名紧邻左括号,后面接着一个“=”号,接着顺序列出结构体中的元素的编码。例如下面这个结构体
typedef struct example {
id anObject;
char *aString;
int anInt;
} Example;
将被编码成如下格式
{example=@*i}
无论是结构体标签名(example)还是新定义的类型名(Example)传给@encode()编码的结果都是一样的。
结构体指针与结构体含有等量的信息,如下
^{example=@*i}
但是更进一步的迂回,将不再携带内部的类型信息
^^{example}
对象也会类似结构体一样进行编码。例如,如果将NSObject类名传入@encode,将会这样编码
{NSObject=#}
NSObject类仅仅声明了一个实例变量,isa
当在一个协议中声明方法的时候,有些@encode指令不会返回,但是运行时系统(runtime system)会用下表这些附加的编码作为类型限定符来表示方法