学习准备

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

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
上一篇下一篇

猜你喜欢

热点阅读