為了與運(yùn)行時(shí)系統(tǒng)(runtime system)協(xié)作淌实,編譯器用字符串的形式編碼方法選擇器的返回值和參數(shù)類型。這種編碼方式在其他情況下也很有用,所以就有了@encode()這個(gè)編譯器指令。@encode通過字符串的形式表示類型瓣颅,可以是表示基本類型int、指針譬正、結(jié)構(gòu)體(tagged structure宫补?)、聯(lián)合或者是類名—包括所有可以用做C運(yùn)算符sizeof()參數(shù)的類型曾我。
char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);
下表列出了一些類型編碼
注意:Objective-C 不支持 long double 類型粉怕。@encode(long double) 返回 d(double的編碼)
數(shù)組類型的編碼是用方括號(hào)括起來(lái)的;緊鄰左括號(hào)的數(shù)字代表著數(shù)組的元素個(gè)數(shù)抒巢,后面的是數(shù)組類型贫贝。例如,一個(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)還是新定義的類型名(Example)傳給@encode()編碼的結(jié)果都是一樣的。
結(jié)構(gòu)體指針與結(jié)構(gòu)體含有等量的信息俺驶,如下
^{example=@*i}
但是更進(jìn)一步的迂回幸逆,將不再攜帶內(nèi)部的類型信息
^^{example}
對(duì)象也會(huì)類似結(jié)構(gòu)體一樣進(jìn)行編碼。例如暮现,如果將NSObject類名傳入@encode还绘,將會(huì)這樣編碼
{NSObject=#}
NSObject類僅僅聲明了一個(gè)實(shí)例變量,isa
當(dāng)在一個(gè)協(xié)議中聲明方法的時(shí)候栖袋,有些@encode指令不會(huì)返回拍顷,但是運(yùn)行時(shí)系統(tǒng)(runtime system)會(huì)用下表這些附加的編碼作為類型限定符來(lái)表示方法