[OC Runtime編程指南_翻譯]一次兆、介紹
[OC Runtime編程指南_翻譯]二、運行時版本和平臺
[OC Runtime編程指南_翻譯]三锹锰、與運行時交互
[OC Runtime編程指南_翻譯]四芥炭、消息傳遞
[OC Runtime編程指南_翻譯]五、動態(tài)方法解析
[OC Runtime編程指南_翻譯]六恃慧、消息轉發(fā)
[OC Runtime編程指南_翻譯]七园蝠、類型編碼
[OC Runtime編程指南_翻譯]八、聲明屬性注:pdf翻譯文檔百度云下載鏈接痢士,密碼:zcs2
為了幫助運行時系統(tǒng)彪薛,編譯器將每個方法的返回和參數(shù)類型編碼為字符串,并將字符串與方法選擇器相關聯(lián)良瞧。它使用的編碼方案在其他上下文中也很有用陪汽,因此可以通過@encode()
編譯器指令公開使用。當給定類型規(guī)范時褥蚯,@encode()
返回對該類型進行編碼的字符串
挚冤。類型可以是基本類型,如int赞庶、指針训挡、帶標記的結構或聯(lián)合澳骤,也可以是任何類型的類名,事實上澜薄,任何類型都可以用作C sizeof()
運算符的參數(shù)为肮。
char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);
下表列出了類型代碼。請注意肤京,其中許多代碼與您在為存檔或分發(fā)而對對象進行編碼時使用的代碼重疊颊艳。但是,這里列出了一些您在編寫編碼器時不能使用的代碼忘分,還有一些代碼可能需要在編寫不是由@encode()
生成的編碼器時使用棋枕。(請參閱《基礎框架參考》中的 NSCoder類規(guī)范,以獲取有關為存檔或分發(fā)對象編碼的更多信息。)
Table 6-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) |
重要提示:Objective-C不支持long double類型
乐导。@encode(long double)返回d,這與double的編碼相同窥浪。
數(shù)組的類型
代碼用方括號
括起來;數(shù)組中的元素數(shù)在左括號后緊跟數(shù)組類型之前指定笛丙。例如漾脂,一個由12個指向浮點的指針組成的數(shù)組將被編碼為:
[12^f]
結構體
在大括號
內(nèi)指定,聯(lián)合體
在括號
內(nèi)指定胚鸯。首先列出結構標記符相,然后是等號和按順序列出的結構字段的代碼。例如蠢琳,一個結構
typedef struct example {
id anObject;
char *aString;
int anInt;
} Example;
編碼方式如下:
{example=@*i}
無論定義的類型名(Example)還是結構標記(Example)傳遞給@encode()
,都會產(chǎn)生相同的編碼結果镜豹。結構指針的編碼攜帶與結構字段相同的信息量:
^{example=@*i}
但是傲须,另一個間接級別會刪除內(nèi)部類型規(guī)范:
^^{example}
對象被視為結構。例如趟脂,將NSObject
類名傳遞給@encode()
將生成以下編碼:
{NSObject=#}
NSObject
類只聲明一個class類型的實例變量isa
泰讽。
注意,盡管@encode()指令沒有返回它們昔期,但是當類型限定符用于聲明協(xié)議中的方法時已卸,運行時系統(tǒng)使用表6-2中列出的附加編碼。
Table 6-2 Objective-C方法編碼
Code | Meaning |
---|---|
r | const |
n | in |
N | inout |
o | out |
O | bycopy |
R | byref |
V | oneway |