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

SEL/objc_selector

透明的数据结构,可以理解为C String

    typedef struct objc_selector *SEL;

也就是说,SEL是指向一个C String的指针。


id/objc_object

id - 指向一个类的实例对象 
底层代码定义

    typedef struct objc_object *id;

其中 
objc_object的底层定义

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

可以看到,objc_object中,只是保存了一个Class类型的isa。这里看不懂不要怕,先记着,对象中就是保存了一个指向Objective C中对应类的指针。

Class/objc_class

Class - 指向Objective C类对象(objc_class)的一个指针 
底层定义

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;/* 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
}

你可能感兴趣的:(iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,method,Iva)