IOS中對象、類、元類的關(guān)系及作用

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相同

歡迎關(guān)注公共號,ios開發(fā)雜談:iosdevextend
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容