iOS Runtime详解(新手也看得懂)

2020-01-21 07:51:57刘景俊

先看下定义


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;

Method和我们平时理解的函数是一致的,就是表示能够独立完成一个功能的一段代码,比如:


- (void)logName
{
 NSLog(@"name");
}

这段代码,就是一个函数。

我们来看下objc_method这个结构体的内容:

  • SEL method_name 方法名
  • char *method_types 方法类型
  • IMP method_imp 方法实现

    在这个结构体重,我们已经看到了SEL和IMP,说明SEL和IMP其实都是Method的属性。

    我们接着来看SEL。

    SEL(objc_selector)

    先看下定义

    
    Objc.h
    /// An opaque type that represents a method selector.代表一个方法的不透明类型
    typedef struct objc_selector *SEL;

    objc_msgSend函数第二个参数类型为SEL,它是selector在Objective-C中的表示类型(Swift中是Selector类)。selector是方法选择器,可以理解为区分方法的 ID,而这个 ID 的数据结构是SEL: