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