6.Runtime官方文档学习--类型编码

官方文档

To assist the runtime system, the compiler encodes the return and argument types for each method in a character string and associates the string with the method selector. The coding scheme it uses is also useful in other contexts and so is made publicly available with the @encode() compiler directive. When given a type specification, @encode() returns a string encoding that type. The type can be a basic type such as an int, a pointer, a tagged structure or union, or a class name—any type, in fact, that can be used as an argument to the C sizeof() operator.

为了帮助运行时系统,编译器把每个方法的返回值和参数类型编码成一个字符串,并把这个字符串和方法选择器关联起来。它使用的编码方案在其他上下文中也有用,因此可通过编译器指令@encode()来公开使用它。当给定一个类型格式,@encode()返回一个编码这个类型的字符串。这个类型可以是一个基础类型,例如int,指针,标记过的结构体或集合,或类名--事实上,任何可以用作C语言中sizeof()操作符的参数的类型都可以。

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

The table below lists the type codes. Note that many of them overlap with the codes you use when encoding an object for purposes of archiving or distribution. However, there are codes listed here that you can’t use when writing a coder, and there are codes that you may want to use when writing a coder that aren’t generated by @encode(). (See the NSCoder class specification in the Foundation Framework reference for more information on encoding objects for archiving or distribution.)

下面的表列举了类型编码。注意它们中的许多在为了归档或分发而编码对象时会和你使用的代码发生重叠。然而,列出的编码有的在编写编码器时你无法使用,当你编写编码器时可能想要使用的有些编码不是由@encode()生成的。(有关编码对象的归档或分发的详细信息,请参阅Foundation Framework参考中的NSCoder类规范。)

Table 1 Objective-C type encodings

Code Meaning
c A char
i An int
s A short
l A long. l is treated as a 32-bit quantity on 64-bit programs.
q A long long
C An unsigned char
I An unsigned int
S An unsigned short
L An unsigned long
Q An unsigned long long
f A float
d A double
B A C++ bool or a C99 _Bool
v A 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
bnum A bit field of num bits
^type A pointer to type
? An unknown type (among other things, this code is used for function pointers)

Important: Objective-C does not support the long double type. @encode(long double) returns d, which is the same encoding as for double.

重要Objective-C不支持long double类型。@encode(long double)会返回d,和double一样的编码。

The type code for an array is enclosed within square brackets; the number of elements in the array is specified immediately after the open bracket, before the array type. For example, an array of 12 pointers to floats would be encoded as:

数组的类型编码用方括号括起来;数组元素的数量是在开括号之后,数组类型之前立即指定的。例如,一个有12个指向float的指针数组会被编码成:

[12^f]

Structures are specified within braces, and unions within parentheses. The structure tag is listed first, followed by an equal sign and the codes for the fields of the structure listed in sequence. For example, the structure

结构体是在大括号内指定,集合是在小括号内。结构体标记首先会被列出来,接下来是等号和序列中列出来的结构体字段的编码。例如,结构体:

typedef struct example {
    id   anObject;
    char *aString;
    int  anInt;
} Example;

会被编码成:

{example=@*i}

The same encoding results whether the defined type name (Example) or the structure tag (example) is passed to @encode(). The encoding for a structure pointer carries the same amount of information about the structure’s fields:

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

^{example=@*i}

However, another level of indirection removes the internal type specification:

但是,另一种间接的级别移除了内部类型规范:

^^{example}

Objects are treated like structures. For example, passing the NSObject class name to @encode() yields this encoding:

对象像结构体一样。例如,把NSObject类名传递给@encode()产生这个编码:

{NSObject=#}

The NSObject class declares just one instance variable, isa, of type Class.

NSObject类只声明了一个类型为Class的实例变量isa

Note that although the @encode() directive doesn’t return them, the runtime system uses the additional encodings listed in Table 6-2 for type qualifiers when they’re used to declare methods in a protocol.

注意尽管@encode()指令没有返回它们,但是运行时系统在它们被用于在协议中声明方法时使用如下表中列举的额外的编码来表示类型限定符。

Table 2 Objective-C method encodings

Code Meaning
r const
n in
N inout
o out
O bycopy
R byref
V oneway
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 今天的晨读材料来自《最重要的事,只有一件》,作者之一加里.凯勒,是世界上最大的地产公司董事长。 作者围绕“为什么”...
    钱生钱落地实操阅读 179评论 4 5
  • 我是一个中年人,但是从毕业后两年起,似乎就停止了成长,就如5岁的幼童心智。我迫切的在找自己的问题,找停滞不前的原因...
    lovegrace阅读 133评论 0 0
  • Vue.js Vue.js 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进...
    其实_dnhl阅读 287评论 0 0
  • 渴了,好想吃个大西瓜,
    人生若只如初16阅读 155评论 0 0
  • 让爱来引导我们的生活, 如此,家庭的整体才能在和睦中团结起来。 一:要强调共通点而非分歧,家庭是一个先讲感情再讲道...
    菲菲小札阅读 484评论 0 0