iOS : runtime -- Type Encodings

筆記記錄:來(lái)源于apple的文檔,具體參考:apple文檔

類型編碼

為了幫助運(yùn)行時(shí)系統(tǒng),編譯器對(duì) 回報(bào) 和參數(shù)類型用于字符串中的每個(gè)方法,并將該字符串與方法選擇器相關(guān)聯(lián)。它使用的編碼方案在其他上下文中也很有用,因此可以通過@encode()編譯器指令公開使用。當(dāng)給出類型說明時(shí),@encode()返回編碼該類型的字符串。該類型可以是基本類型,例如int,指針,帶標(biāo)簽的結(jié)構(gòu)或聯(lián)合或類名,實(shí)際上可以用作Csizeof()運(yùn)算符的參數(shù)的任何類型。

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

下表列出了類型代碼。請(qǐng)注意,它們中的許多與您出于歸檔或分發(fā)目的而對(duì)對(duì)象進(jìn)行編碼時(shí)所使用的代碼重疊。但是,這里列出了一些代碼,這些代碼在編寫編碼器時(shí)無(wú)法使用,并且某些代碼可能不是由以下人員生成的,它們可能會(huì)在編寫編碼器時(shí)使用@encode()。(有關(guān)NSCoder用于歸檔或分發(fā)的編碼對(duì)象的更多信息,請(qǐng)參見Foundation Framework參考中的類規(guī)范。)

Objective-C類型編碼


image.png

要點(diǎn): Objective-C不支持該long double類型。@encode(long double)返回d,與的編碼相同double。

數(shù)組的類型代碼括在方括號(hào)內(nèi);數(shù)組中元素的數(shù)量是在方括號(hào)之后,數(shù)組類型之前指定的。例如,指向floats的12個(gè)指針的數(shù)組將被編碼為:

[12 ^ f]

在括號(hào)內(nèi)指定結(jié)構(gòu),在括號(hào)內(nèi)指定并集。首先列出結(jié)構(gòu)標(biāo)簽,然后是等號(hào),并按順序列出結(jié)構(gòu)字段的代碼。例如結(jié)構(gòu):

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

會(huì)這樣編碼:

{example = @ * i}

無(wú)論將定義的類型名稱(Example)還是結(jié)構(gòu)標(biāo)記(example)傳遞給,編碼結(jié)果都相同@encode()。結(jié)構(gòu)指針的編碼包含有關(guān)結(jié)構(gòu)字段的相同數(shù)量的信息:

^ {example = @ * i}

但是,另一種間接訪問級(jí)別刪除了內(nèi)部類型規(guī)范:

^^ {example}

對(duì)象被當(dāng)作結(jié)構(gòu)對(duì)待。例如,將NSObject類名傳遞給會(huì)@encode()產(chǎn)生以下編碼:

{NSObject =#}

NSObject類僅聲明了一個(gè)實(shí)例變量isa的類型類。
請(qǐng)注意,盡管該@encode()指令未返回它們,但是當(dāng)運(yùn)行時(shí)系統(tǒng)用于在協(xié)議中聲明方法時(shí),它們將表6-2中列出的其他編碼用于類型限定符。
Objective-C方法編碼

image.png

大千世界,求同存異;相遇是緣,相識(shí)是份,相知便是“猿糞”(緣分)
From MZou

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容