iOS : runtime -- Type Encodings

笔记记录:来源于apple的文档,具体参考:apple文档

类型编码

为了帮助运行时系统,编译器对 回报 和参数类型用于字符串中的每个方法,并将该字符串与方法选择器相关联。它使用的编码方案在其他上下文中也很有用,因此可以通过@encode()编译器指令公开使用。当给出类型说明时,@encode()返回编码该类型的字符串。该类型可以是基本类型,例如int,指针,带标签的结构或联合或类名,实际上可以用作Csizeof()运算符的参数的任何类型。

char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);

下表列出了类型代码。请注意,它们中的许多与您出于归档或分发目的而对对象进行编码时所使用的代码重叠。但是,这里列出了一些代码,这些代码在编写编码器时无法使用,并且某些代码可能不是由以下人员生成的,它们可能会在编写编码器时使用@encode()。(有关NSCoder用于归档或分发的编码对象的更多信息,请参见Foundation Framework参考中的类规范。)

Objective-C类型编码


image.png

要点: Objective-C不支持该long double类型。@encode(long double)返回d,与的编码相同double。

数组的类型代码括在方括号内;数组中元素的数量是在方括号之后,数组类型之前指定的。例如,指向floats的12个指针的数组将被编码为:

[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()指令未返回它们,但是当运行时系统用于在协议中声明方法时,它们将表6-2中列出的其他编码用于类型限定符。
Objective-C方法编码

image.png

大千世界,求同存异;相遇是缘,相识是份,相知便是“猿粪”(缘分)
From MZou

你可能感兴趣的:(iOS : runtime -- Type Encodings)