OC中類的結構

powerx_yc發表於2017-04-06

NSObject

@interface NSObject <NSObject> {
    Class isa;
}

其中Class是一個結構(struct)指標

typedef struct objc_class *Class;

其中objc_class結構如下

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到底是什麼?之間有什麼區別和聯絡

objc_class中也有一個isa物件,這是因為一個 ObjC 類本身同時也是一個物件,為了處理類和物件的關係,runtime 庫建立了一種叫做元類 (Meta Class) 的東西,類物件所屬型別就叫做元類,而這個元類同時也是一個根元類 (root meta class) 的例項。所有的元類最終都指向根元類為其超類
objc_ivar_list結構體儲存著objc_ivar陣列列表,而objc_ivar結構體儲存了類的單個成員變數的資訊;同理objc_method_list結構體儲存著objc_method陣列列表,而objc_method結構體儲存了類的某個方法的資訊。
Cache為方法呼叫的效能進行優化,通俗地講,每當例項物件接收到一個訊息時,它不會直接在isa指向的類的方法列表中遍歷查詢能夠響應訊息的方法,因為這樣效率太低了,而是優先在Cache中查詢。Runtime 系統會把被呼叫的方法存到Cache中(理論上講一個方法如果被呼叫,那麼它有可能今後還會被呼叫),下次查詢的時候效率更高。

Ivar是一種代表類中例項變數的型別

typedef struct objc_ivar *Ivar; 

結構如下
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
}  

相關文章