返回介绍

键入编码

发布于 2024-10-06 10:34:44 字数 13113 浏览 0 评论 0 收藏 0

为了协助运行时系统,编译器进行编码 返回值 和参数类型对于字符串中的每个方法,并将该字符串与方法选择器相关联。它使用的编码方案在其他上下文中也很有用,因此可以使用@encode()编译器指令公开。给定类型规范时,@encode()返回编码该类型的字符串。类型可以是基本类型,例如int,指针,标记结构或联合,或类名 - 事实上,任何类型都可以用作C sizeof()运算符的参数。

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

下表列出了类型代码。请注意,它们中的许多重叠与编码对象时用于存档或分发的代码重叠。但是,此处列出的代码在编写编码器时无法使用,并且在编写非编译器时可能需要使用的代码@encode()。(有关NSCoder编码对象以进行存档或分发的详细信息,请参阅Foundation Framework参考中的类规范。)

Table 6-1 Objective-C type encodings

CodeMeaning
cA char
iAn int
sA short

l

A long

l is treated as a 32-bit quantity on 64-bit programs.

| q | A long long | | :--- | :--- |

CAn unsigned char
IAn unsigned int
SAn unsigned short
LAn unsigned long
QAn unsigned long long
fA float
dA double
BA C++ bool or a C99 _Bool
vA void
*A character string (char *)
@An object (whether statically typed or typed id)
#A class object (Class)
:A method selector (SEL)
[array type]An array
{name=type...}A structure
(name=type...)A union
bnumA bit field of num bits
^typeA pointer to type
?An unknown type (among other things, this code is used for function pointers)

重要说明: 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}

无论是否传递定义的类型name(Example)或结构标记(example),都会产生相同的编码结果@encode()。结构指针的编码带有关于结构字段的相同数量的信息:

^{example=@*i}

但是,另一个间接级别会删除内部类型规范:

^^{example}

对象被视为结构。例如,传递NSObject类名以@encode()产生此编码:

{NSObject=#}

NSObject类仅声明了一个实例变量,isa类类。

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

Table 6-2 Objective-C method encodings

CodeMeaning
rconst
nin
Ninout
oout
Obycopy
Rbyref
Vonewa

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文