关于一些比较底层的名词解释

IMP SEL
这两个名词一般都是相对来看的 ,SEL类型的变量可以根据@select(方法名)得到,只要方法名一样,那么得到的这个变量就是一样的,即使不在一个类里面,而系统通过方法映射地址找到唯一的方法指针指向的地址,就是IMP,IMP的定义:

typedef id (*IMP)(id, SEL, ...); 

在runtime里面通过以下方法获取:

method_getImplementation(Method m) 

isa
在每个类里面都可以找到一个class类型的isa,那么isa是什么呢,oc中是这样定义的:

@interface NSObject  {
    Class isa  OBJC_ISA_AVAILABILITY;
}

接着往下找

typedef struct objc_class *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;

这样我们就可以看到关于这个类里面的所有信息了,无论是方法列表还是属性列表都可以找到,大胆猜测,系统NSClassFromString()等一些列方法就是根据这个isa指针找到结果的,这个isa指针是隐藏在NSObject类里面的,所以所有的类都有这个指针。

Ivar property
Ivar是实例变量,在MRC 时代用的比较多,iOS6以后普及ARC之后开始用property比较方便了,不需要在意内存的管理了。
property 属性,其实可以看成property = Ivar + getter + setter。
需要说一下的是getter和setterfan方法是编译器自动添加的,不需要手动写,不过如果有特殊需要,也可以手动写,覆盖自动添加的。(具体的添加方法:每在对象里面添加一个属性,编译器会在isa的ivars里面添加一个名称为在属性名称前加一个下划线的实例变量,即_变量名,然后在methodLists里面添加一个setter方法描述,添加一个getter方法描述,根据计算该属性在对象中的偏移量来具体实现方法,附上一个个人感觉说的很明白的空间门https://segmentfault.com/q/1010000000185056)

Method
Method是一个objc_method的结构体,在网上找到的定义:

struct objc_method {  
    SEL method_name;        // 方法名称  
    charchar *method_typesE;    // 参数和返回类型的描述字串  
    IMP method_imp;         // 方法的具体的实现的指针  
}   

可以看到这个结构体里面定义了关于这个方法的基本信息。
Method通过以下方法获取:

class_getClassMethod(Class cls, SEL name)

暂时只能想到这些名词,欢迎大家在评论区交流~~

你可能感兴趣的:(关于一些比较底层的名词解释)