1. 程式人生 > >iOS Class結構分析

iOS Class結構分析

類在objective-C中是objc_class 結構體指標

typedef struct objc_class *Class;

objc/runtime.h中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: 指向元類的objc_class結構體指標,iOS中的類也是物件,元類中儲存有類物件的類方法;

superclass: 指向父類的objc_class結構體指標,可以通過父類的指標找到變數和方法;

name:類名;

version:版本號,預設為0

info:其他資訊,執行期間的一些位標示

instance_size:類例項變數大小

ivars:該類的成員變數連結串列,是objc_ivar_list結構體指標,

struct objc_ivar_list {  
    int ivar_count;  
    /* variable length structure */  
    struct objc_ivar ivar_list[1];  
}  

objc_var:變數結構體---名稱,型別,偏移位元組和佔用的空間

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
}   
objc_method_list: 方法連結串列結構體
struct objc_method_list {
    struct objc_method_list *obsolete                        OBJC2_UNAVAILABLE; 

    int method_count                                         OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space                                                OBJC2_UNAVAILABLE;
#endif
    /* variable length structure */
    struct objc_method method_list[1]                        OBJC2_UNAVAILABLE;
}                                                            

method: 物件的每個方法的結構體,SEL是方法選擇器,是HASH後的值,可以通過這個值找到函式體的實現,IMP 是函式指標

struct objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;
    char *method_types                                       OBJC2_UNAVAILABLE;
    IMP method_imp                                           OBJC2_UNAVAILABLE;
}    
cache: 物件使用過的方法連結串列,
struct objc_cache {
    unsigned int mask /* total = mask + 1 */                 OBJC2_UNAVAILABLE;
    unsigned int occupied                                    OBJC2_UNAVAILABLE;
    Method buckets[1]                                        OBJC2_UNAVAILABLE;
};
protocols:協議連結串列
struct objc_protocol_list {
    struct objc_protocol_list *next;
    long count;
    Protocol *list[1];
};