Type Encodings(文档翻译)

为了与运行时系统(runtime system)协作,编译器用字符串的形式编码方法选择器的返回值和参数类型。这种编码方式在其他情况下也很有用,所以就有了@encode()这个编译器指令。@encode通过字符串的形式表示类型,可以是表示基本类型int、指针、结构体(tagged structure?)、联合或者是类名—包括所有可以用做C运算符sizeof()参数的类型。

char *buf1 = @encode(int **);

char *buf2 = @encode(struct key);

char *buf3 = @encode(Rectangle);

下表列出了一些类型编码

Type Encodings(文档翻译)_第1张图片

注意: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)会用下表这些附加的编码作为类型限定符来表示方法


Type Encodings(文档翻译)_第2张图片

你可能感兴趣的:(Type Encodings(文档翻译))