SEL、IMP、Method、isa(ios runtime 理
2019-01-02 本文已影响11人
派大星的博客
1、Class == struct objc_class 结构体定义
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char * _Nonnull name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
结构体里保存了指向父类的指针、类的名字、版本、实例大小、实例变量列表、方法列表、缓存、遵守的协议列表等。
2、Method == struct objc_method 结构体定义
runtime.h
/// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型
typedef struct objc_method *Method;
struct objc_method {
SEL method_name OBJC2_UNAVAILABLE;
char *method_types OBJC2_UNAVAILABLE;
IMP method_imp OBJC2_UNAVAILABLE;
}
我们来看下objc_method这个结构体的内容:
- SEL method_name 方法名
- char *method_types 方法类型
- IMP method_imp 方法实现
SEL
A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime.
Selectors generated by the compiler are automatically mapped by the runtime when the class is loaded.
objc_msgSend函数第二个参数类型为SEL,它是selector在Objective-C中的表示类型(Swift中是Selector类)。
selector是方法选择器,可以理解为区分方法的 ID,而这个 ID 的数据结构是SEL:
selector是一个string
IMP
A pointer to the function of a method implementation.
指向一个方法实现的指针
就是指向最终实现程序的内存地址的指针。
在iOS的Runtime中,Method通过selector和IMP两个属性,实现了快速查询方法及实现,相对提高了性能,又保持了灵活性。
3、isa指针
struct objc_object结构体实例它的isa指针指向类对象,
类对象的isa指针指向了元类,
super_class指针指向了父类的类对象,
而元类的super_class指针指向了父类的元类,
那元类的isa指针又指向了自己。
png
Objecive-C runtime 理解草图
Objecive-C runtime 理解.jpg