MacOS开发 技术集锦iOS&Mac

Type Encodings(类型编码)

2018-05-02  本文已影响4人  ADreamClusive

原文链接看这里!!!

为了帮助运行时系统更好地运行,编译器将方法的返回值和参数编码到一个字符串中,并将字符串与方法选择器相关联。它使用的编码方案在其他场景也是有用的,因此将@endoce()编译器指令公开使用。在给定类型规范时,@encode()返回该类型的字符串编码。该类型可以是int、指针、表及结构体或联合体这样的基本数据类型,也可以是任何可以作为C sizeof()操作符参数的类名。

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

char *buf2 = @encode(struct key);

char *buf3 = @encode(Rectangle);

下表列出了类型代码。注意到它们中的许多与为了归档和分发而压缩对象使用的编码是重叠的。然而,将一些我们在编写编码器时不能使用的编码也列在了这里,并且这里列出了一些你编写而不是通过@encode()产生编码器时可能想要使用的一些编码。(请参阅Foundation Framework参考中的NSCoder类规范,以获取编码对象以进行归档或分发的更多信息。)

表6-1 Objective-C类型编码

-------- ------------------------------------------------------------------

由于原表太大,这里直接跳转到原文查看即可!!!

----------------------------------------------------------------------------

重要:Objective-C类型不支持长双精度类型。@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=#}

NSObjec类仅声明了Class类型的一个实例变量---isa。

注意,尽管@encode()指令不返回他们,但当他们用于在协议中声明方法时,运行时系统使用表6-2中列出的用于类型限定符的附加编码。

表6-2 Objective-C方法编码

上一篇下一篇

猜你喜欢

热点阅读