iOS Runtime詳解之SEL,Class,id,IMP,_cmd,isa,method,Iva

SEL/objc_selector

透明的數據結構,能夠理解爲C String數據結構

    typedef struct objc_selector *SEL;函數

也就是說,SEL是指向一個C String的指針。spa


id/objc_object
指針

id - 指向一個類的實例對象 
底層代碼定義code

    typedef struct objc_object *id;對象

其中 
objc_object的底層定義內存

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

能夠看到,objc_object中,只是保存了一個Class類型的isa。這裏看不懂不要怕,先記着,對象中就是保存了一個指向Objective C中對應類的指針。
cmd

Class/objc_class

Class - 指向Objective C類對象(objc_class)的一個指針 
底層定義io

typedef struct objc_class *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;/* Use `Class` instead of `struct objc_class *` */

能夠看到,這就是類對象結構體的定義,細心的同窗可能發現了類對象裏仍然有一個指針Class isa,先記着,這個isa指向的是類元對象。

IMP

IMP-指向實際執行函數體的函數指針

#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif

能夠看到,這個函數體前兩個參數是 id(消息接受者,也就是對象),以及SEL(方法的名字)

method/objc_method

method - 指向Objective C中的方法的指針

typedef struct objc_method *Method;11

其中

struct objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;    
   char *method_types                                       OBJC2_UNAVAILABLE;
   IMP method_imp                                           OBJC2_UNAVAILABLE;
}

_cmd

SEL 類型的一個變量,Objective C的函數的前兩個隱藏參數爲self 和 _cmd

Ivar

ivar - objective C中的實例變量

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
}
相關文章
相關標籤/搜索