Type Encodings(文档翻译)

为了与运行时系统(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)会用下表这些附加的编码作为类型限定符来表示方法


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容