為了與運(yùn)行時(shí)系統(tǒng)(runtime system)協(xié)作,編譯器用字符串的形式編碼方法選擇器的返回值和參數(shù)類(lèi)型。這種編碼方式在其他情況下也很有用,所以就有了@encode()這個(gè)編譯器指令。@encode通過(guò)字符串的形式表示類(lèi)型,可以是表示基本類(lèi)型int、指針、結(jié)構(gòu)體(tagged structure?)、聯(lián)合或者是類(lèi)名—包括所有可以用做C運(yùn)算符sizeof()參數(shù)的類(lèi)型。
char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);
下表列出了一些類(lèi)型編碼

注意:Objective-C 不支持 long double 類(lèi)型。@encode(long double) 返回 d(double的編碼)
數(shù)組類(lèi)型的編碼是用方括號(hào)括起來(lái)的;緊鄰左括號(hào)的數(shù)字代表著數(shù)組的元素個(gè)數(shù),后面的是數(shù)組類(lèi)型。例如,一個(gè)擁有12個(gè)float型元素的數(shù)組將被如下編譯
[12^f]
結(jié)構(gòu)體用大括號(hào),聯(lián)合用小括號(hào)表示。結(jié)構(gòu)體的標(biāo)簽名緊鄰左括號(hào),后面接著一個(gè)“=”號(hào),接著順序列出結(jié)構(gòu)體中的元素的編碼。例如下面這個(gè)結(jié)構(gòu)體
typedef struct example {
id? anObject;
char *aString;
int? anInt;
} Example;
將被編碼成如下格式
{example=@*i}
無(wú)論是結(jié)構(gòu)體標(biāo)簽名(example)還是新定義的類(lèi)型名(Example)傳給@encode()編碼的結(jié)果都是一樣的。
結(jié)構(gòu)體指針與結(jié)構(gòu)體含有等量的信息,如下
^{example=@*i}
但是更進(jìn)一步的迂回,將不再攜帶內(nèi)部的類(lèi)型信息
^^{example}
對(duì)象也會(huì)類(lèi)似結(jié)構(gòu)體一樣進(jìn)行編碼。例如,如果將NSObject類(lèi)名傳入@encode,將會(huì)這樣編碼
{NSObject=#}
NSObject類(lèi)僅僅聲明了一個(gè)實(shí)例變量,isa
當(dāng)在一個(gè)協(xié)議中聲明方法的時(shí)候,有些@encode指令不會(huì)返回,但是運(yùn)行時(shí)系統(tǒng)(runtime system)會(huì)用下表這些附加的編碼作為類(lèi)型限定符來(lái)表示方法
