1.id的本質(zhì)是什么?
說到id 就是跟SEL一樣 id也被定義在Objc/objc.h目錄下
typedef struct objc_object*id
說到id它是一個結(jié)構(gòu)體指針類型,它可以指向Objective-C的中的任何對象.objc_object結(jié)構(gòu)體
struct objc_object{Class isa OBJC_ISA_AVAILABILITY}
我們通常說的對象,就是長這個樣子,這個結(jié)構(gòu)體只有一個成員變量isa ,對象可以通過isa指針找到其所屬的類,isa指針是一個class類型的成員變量.
說到class也是一個結(jié)構(gòu)體指針類型
它的原型是這樣的typedef struct objc_class *Class
class 也有一個isa指針,指向所屬的元類(meta).
super _class 是指向超類
name: 是類名
version 是類的版本信息
info 是類的詳情
instance_size 是指的該類的實例對象的大小
dinars指向該類的成員變量列表
methodLists: 指向該類的實例方法列表,它將方法選擇器和方法實現(xiàn)地址聯(lián)系起來,methodlists是指向objc_mthod_list指針的指針,也就是說可以動態(tài)的修改*methdLists 的值來添加成員方法,這也就是分類可以增加方法不可增加屬性的原因了.
cache: Runtime系統(tǒng)會把調(diào)用的方法存到cache中(理論上將一個方法如果被調(diào)用者,那么它有可能今后還會被調(diào)用),下次查找的時候效率更高
protocols:指向該類的協(xié)議列表
也就是當(dāng)我們調(diào)用一個方法時,其運行過程大致如下:
Rumtime系統(tǒng)會把方法調(diào)換轉(zhuǎn)化為方法發(fā)送,就objc_megSend,并且把方法的調(diào)用者,和方法選擇器,當(dāng)做參數(shù)傳遞過去.
此時,方法的調(diào)用者會通過isa指針來找到其所屬的類,然后在cache或者methodLists中查找該方法,找得到就會跳到對應(yīng)的方法去執(zhí)行.
如果在類中沒有找到該方法,就會去super_calss父類里面找,一直找到NSObjc.沒有找到就報錯
內(nèi)容參考自objc中國