OC中類的結(jié)構(gòu)

NSObject

@interface NSObject <NSObject> {
    Class isa;
}

其中Class是一個結(jié)構(gòu)(struct)指針

typedef struct objc_class *Class;

其中objc_class結(jié)構(gòu)如下

struct objc_class {
    Class           isa  OBJC_ISA_AVAILABILITY;
    
#if !__OBJC2__
    Class                       super_class                                        OBJC2_UNAVAILABLE;
    const char                  *name                                         OBJC2_UNAVAILABLE;
    long                        version                                             OBJC2_UNAVAILABLE;
    long                        info                                                OBJC2_UNAVAILABLE;
    long                        instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list       *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list     **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache           *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list   *protocols                     OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;

怎么又有一個isa??這些isa到底是什么?之間有什么區(qū)別和聯(lián)系

objc_class中也有一個isa對象,這是因為一個 ObjC 類本身同時也是一個對象,為了處理類和對象的關(guān)系,runtime 庫創(chuàng)建了一種叫做元類 (Meta Class) 的東西,類對象所屬類型就叫做元類,而這個元類同時也是一個根元類 (root meta class) 的實例。所有的元類最終都指向根元類為其超類
objc_ivar_list結(jié)構(gòu)體存儲著objc_ivar數(shù)組列表,而objc_ivar結(jié)構(gòu)體存儲了類的單個成員變量的信息;同理objc_method_list結(jié)構(gòu)體存儲著objc_method數(shù)組列表,而objc_method結(jié)構(gòu)體存儲了類的某個方法的信息。
Cache為方法調(diào)用的性能進行優(yōu)化,通俗地講,每當(dāng)實例對象接收到一個消息時,它不會直接在isa指向的類的方法列表中遍歷查找能夠響應(yīng)消息的方法,因為這樣效率太低了,而是優(yōu)先在Cache中查找。Runtime 系統(tǒng)會把被調(diào)用的方法存到Cache中(理論上講一個方法如果被調(diào)用,那么它有可能今后還會被調(diào)用),下次查找的時候效率更高。

Ivar是一種代表類中實例變量的類型

typedef struct objc_ivar *Ivar; 

結(jié)構(gòu)如下
struct objc_ivar {
    char *ivar_name                                          OBJC2_UNAVAILABLE;
    char *ivar_type                                          OBJC2_UNAVAILABLE;
    int ivar_offset                                          OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space                                                OBJC2_UNAVAILABLE;
#endif
}  

最后編輯于
?著作權(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)容