ios中,對象,類是比較常見的概念,這次梳理obj_msgSend原理,借此梳理下對象、類、元類在oc中內(nèi)存布局,及相互的一個關(guān)系。
對象和類的概念,網(wǎng)上的普及的比較多,這里不做過多的介紹,對象是類的實例,類是對象的抽象,我們把主要的精力放在ios的內(nèi)存布局中.
ios中,我們定義的類,在實現(xiàn)的時候原碼如下:
typedef struct objc_class *Class;
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
typedef struct objc_object *id;
其實一個類就是一個指向objc_object 的結(jié)構(gòu)體,而objc_object是一個包含 Class的結(jié)構(gòu)體,所以一個實例,是一個實例化了isa指針的結(jié)構(gòu)體,而Class是一個指向objc_class結(jié)構(gòu)體的指針,我們看下objc_class的結(jié)構(gòu)體都包含哪些東西
struct objc_class {
struct objc_class * isa; //類指針(類是元類的對象)
struct objc_class * super_class; /*父類*/
const char *name; /*類名字*/
long version; /*版本信息*/
long info; /*類信息*/
long instance_size; /*實例大小*/
struct objc_ivar_list *ivars; /*實例參數(shù)鏈表*/
struct objc_method_list **methodLists; /*方法鏈表*/
struct objc_cache *cache; /*方法緩存*/
struct objc_protocol_list *protocols; /*協(xié)議鏈表*/
};

image
如圖所示
1.每一個實例包含一個isa對象
2.isa指向類,類是一個objc_class結(jié)構(gòu)體,包含實例的方法列表,參數(shù)列表,category等,除此之外,objc_class中還有一個super_class,指向其類的父類,isa指針,這里的isa指針指向元類,即metaClass,元類存儲類方法等信息
3.元類里也包含isa指針,元類里的isa指針指向 根元類,根元類的isa指針指向自己
4.obj_msgSend發(fā)送實例消息的時候,先找到實例,然后通過實例的isa指針找到類的方法列表及參數(shù)列表等,如果找到,返回,如果沒有找到,則通過super_class在其父類中重復(fù)此過程
5.obj_msgSend發(fā)送類消息的時候,通過類的isa,找到元類,然后流程與步驟4相同