IMP SEL
这两个名词一般都是相对来看的 ,SEL类型的变量可以根据@select(方法名)得到,只要方法名一样,那么得到的这个变量就是一样的,即使不在一个类里面,而系统通过方法映射地址找到唯一的方法指针指向的地址,就是IMP,IMP的定义:
typedef id (*IMP)(id, SEL, ...);
在runtime里面通过以下方法获取:
method_getImplementation(Method m)
isa
在每个类里面都可以找到一个class类型的isa,那么isa是什么呢,oc中是这样定义的:
@interface NSObject <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)
暂时只能想到这些名词,欢迎大家在评论区交流~~